Android studio как работать с api
Перейти к содержимому

Android studio как работать с api

  • автор:

Как сделать API на любое Android приложение. На примере WhatsApp

Приветствую! Нарисовалась у меня задача: нужно интегрировать в CRM систему мессенджеры, а то трудно анализировать работу менеджеров, когда они общаются с клиентами используя один общий «рабочий» телефон. И первым делом нужно было подключить WhatsApp, как один из самых популярных мессенджеров у нашей целевой аудитории.

Анализ ситуации.

Казалось, требуется всего лишь отправлять и принимать сообщения. А столько подводных камней…

1. Официальный API

Официального API в релизе тогда ещё не было. Но Facebook успел прислать ссылку на форму, для подключения официального API, находящегося в тестировании.

2. Сторонний сервис. Подключение через WhatsApp WEB

Рассматривал вариант «серого» способа, использование неофициального сервиса, который отправляет сообщения через WEB интерфейс, подключается сканированием QR кода.

Но это зависимость от чужого API, в любой момент может всё отвалиться, да и передавать чужому сервису номера клиентов не хотелось. А ещё писать под чужой авторский API, да ещё который придётся переписывать, при переезде на другой сервис, тоже такое себе удовольствие.

Ну и ещё требуется держать телефон включенным (хотя некоторые сервисы за доп плату решали эту проблему 🙂

3. Ручной режим

Посадить человека, пускай копипастит сообщения клиентам. Шутки шутками, а из этой идеи родилось решение!

Решение

Отправка сообщения

image

Есть такая программка для автоматизации действий под Android, называется Tasker, одна из первых подобных программ. Но я в ней не разобрался с первого раза… Поискал аналоги, наткнулся на программу Automagic. В ней события, действия и ветвления рисуются как блок схема.

Оффтоп

Передаю привет конструктору HiAsm, благодаря которому когда то научился понимать концепцию программирования.

И вот в ней я то и придумал решение, root права нам не нужны. Получилось методом научного тыка нарисовать скрипт отправки сообщения, далее буду называть поток, так именуется каждый отдельный нарисованный алгоритм в данной программе. А теперь разберём его работу:

Скриншот потока отправки сообщения в WhatsApp

image

  1. Каждые 5 секунд периодичным таймером генерируется событие и передаётся следующему блоку.
  2. Блок HTTP Request спрашивает у сервера, есть ли в очереди следующее сообщение, которое нужно отправить? Бэкенд написан на PHP.
  3. Парсим ответ сервера JSON.
  4. Если от сервера в ответе пришла метка, что нужно отправить сообщение, идём дальше.
  5. Проверяем, включен ли экран устройства, если нет, отправляем уведомление, с целью разбудить телефон. Если же экран включен, и не выполняется другой поток, проверяющий статус, доставлено ли сообщение, то:
  6. Генерируем ссылку и открываем её, что бы инициировать диалог с полученным от сервера номером телефона в WhatsApp’е
  7. Самое интересное. Блок Control UI. В нём в виде кода реализована логика проверки успешности открытия чата (проверка регистрации в мессенджере), вставка текста в окно ввода и клацанье по кнопке Отправить.

Код писал с мобильного, как заработал, больше не трогал

sleep(2000); // 2 секунды на запуск вацапа sle = 200; ch_c = 0; ch = false; is_sended = false; sleep(sle); ch = existsElementById("com.whatsapp:id/entry"); // Проверяем, появилась ли на экране кнопка отправить sleep(sle); if (ch == false) < ch = existsElementById("com.whatsapp:id/entry"); // Снова проверяем ch_c = ch_c + 1; sleep(1500); >if (ch == false) < ch = existsElementById("com.whatsapp:id/entry"); ch_c = ch_c + 1; sleep(5500); >ch = existsElementById("com.whatsapp:id/entry"); sleep(sle); setText2ById("com.whatsapp:id/entry",text); // Вставляем сообщение sleep(sle); clickById("com.whatsapp:id/send"); // Жмём кнопку отправить sleep(sle); back(); sleep(sle); back(); status = 2; if(ch == true) < // Если всё хорошо, запоминаем, для отправки на сервер is_sended = true; status = 1; >
Приём сообщений

Принимать сообщения на много проще. Ставим событие на уведомление от мессенджера. Как только приходит уведомление, помечаем его прочитанным, и отправляем его на сервер как есть. Тот уже спарсит адресата и текст.

Скриншот алгоритма приёма сообщений

Плюсы, минусы, доработка и планы

Основную функцию отправки сообщения алгоритм выполняет отлично. Так как не используется WEB интерфейс, схватить баню от мессенджера тут меньше рисков, как мне кажется. Арендовал слабенький виртуальный сервер, установил туда Android и перенёс всё.

На отправку одного сообщения новому контакту уходит ~5 сек. Для проверки доставки и прочтения сообщения, разработал отдельный поток, но он в черновом варианте и иногда не срабатывает. Поэтому о нём позже.

В данный момент не реализована функция приёма медиа сообщений (фото, аудио, вложения), но это можно выгружать из WhatsApp, используя кнопку поделиться сообщением в будущем.

Чуть позже хочу сверху виртуальной машины, где запущен мессенджер, написать SIP транк, через который можно будет звонить через WhatsApp как через SIP ^.^ что может сэкономить расходы на связь.

Ещё хочу делать скриншоты аватарок и отправлять их на сервер, для прикрепления миниатюры к контакту в CRM системе.

Ну и вообще самое интересное: Данный способ обёртывания в API подойдёт почти для любого приложения под Android 🙂

Всё изначально разрабатывал и запускал на Android 9, xiaomi mi 9 se, root прав нет.

UPD:
Пример на Python3.8 в качестве бекенда доступен на GitHub, доработан алгоритм ловли уведомлений и код отправки из комментариев от ivan909020

Изучение Android Studio за одну статью! Создание программы с API

Изучение Android Studio за одну статью! Создание программы с API

ОС Андроид – одна из самых популярных ОС в мире. Мы подготовили большой урок по изучению программы Android Studio и построению полноценного Андроид приложения. За урок мы сделаем программу с API.

Информация про Андроид

На ОС Андроид сегодня работают не только мобильные и планшетные устройства, но также всевозможные часы, телевизоры, компьютеры и даже, как бы это не звучало, холодильники.

Несмотря на огромное множество устройств разработка под многие из них происходит через одну общую программу – Android Studio . Конечно же, у каждой платформы будут свои особенности: размер экрана, характеристики устройства и так далее. Тем не менее, общий процесс создания будет примерно схожим.

Таким образом, изучив Андроид Студио вы сможете в будущем спокойно переходить от одной платформы к другой. Напомним, на сегодняшний день только мобильные устройства на ОС Андроид занимают примерно 85% всего рынка смартфонов.

Языки программирования для Андроид

Разрабатывать под Андроид можно за использованием нескольких разных языков программирования. Зачастую все разрабатывают на основе языка Java, но помимо него можно использовать язык Kotlin, Python, React Native, Flutter и даже на HTML и CSS можно делать проекты.

Ниже видео на тему разработки Андроид проекта на HTML и CSS:

Вы можете использовать разные языки, но наиболее часто используется Джава или его более молодой собрат – Kotlin . В любом случае, если вы только приступаете к Андроид, то ни про какой другой язык помимо Джава вам не стоит думать. Если в будущем нужно будет писать на Котлин, то вам все равно знания разработки Андроид проектов на Джава будут нужны.

Установка всего необходимого

Для разработки под Андроид требуется всего две вещи. Во-первых, вам нужно скачать на компьютер Джава JDK. Это можно сделать через официальный сайт Oracle.

Во-вторых, вам потребуется программа Андроид Студио. Именно она является наиболее популярной программой для разработки приложений под Андроид. Скачать бесплатно эту программу можно также с ее официального сайта . После скачивания Джава и Андроид Студио выполните их установку и далее мы сможем приступить к разработке проекта.

Создание функций

Теперь нам нужно создать весь функционал для приложения.

В приложении мы будем получать данные о погоде. Чтобы это делать сперва зарегистрируйтесь и получите API ключ на сайте OpenWeaterMap .

Теперь остается прописать весь код. Код класса «MainActivity» представлен ниже вместе с комментариями.

Дополнительно скачать полностью весь проект можно по этой ссылке .

package com.itproger.weatherapp; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends AppCompatActivity < // Поля, что будут ссылаться на объекты из дизайна private EditText user_field; private Button main_btn; private TextView result_info; @Override protected void onCreate(Bundle savedInstanceState) < // Сработает при создании Activity super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Устанавливаем ссылки на объекты из дизайна user_field = findViewById(R.id.user_field); main_btn = findViewById(R.id.main_btn); result_info = findViewById(R.id.result_info); // Обработчик нажатия на кнопку main_btn.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View view) < // Если ничего не ввели в поле, то выдаем всплывающую подсказку if(user_field.getText().toString().trim().equals("")) Toast.makeText(MainActivity.this, R.string.no_user_input, Toast.LENGTH_LONG).show(); else < // Если ввели, то формируем ссылку для получения погоды String city = user_field.getText().toString(); String key = "ваш ключ здесь"; String url = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + key + "&units=metric&lang=ru"; // Запускаем класс для получения погоды new GetURLData().execute(url); >> >); > @SuppressLint("StaticFieldLeak") private class GetURLData extends AsyncTask  < // Будет выполнено до отправки данных по URL protected void onPreExecute() < super.onPreExecute(); result_info.setText("Ожидайте. "); >// Будет выполняться во время подключения по URL @Override protected String doInBackground(String. strings) < HttpURLConnection connection = null; BufferedReader reader = null; try < // Создаем URL подключение, а также HTTP подключение URL url = new URL(strings[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect(); // Создаем объекты для считывания данных из файла InputStream stream = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(stream)); // Генерируемая строка StringBuilder buffer = new StringBuilder(); String line = ""; // Считываем файл и записываем все в строку while((line = reader.readLine()) != null) buffer.append(line).append("\n"); // Возвращаем строку return buffer.toString(); >catch (MalformedURLException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >finally < // Закрываем соединения if(connection != null) connection.disconnect(); try < if (reader != null) reader.close(); >catch (IOException e) < e.printStackTrace(); >> return null; > // Выполняется после завершения получения данных @SuppressLint("SetTextI18n") @Override protected void onPostExecute(String result) < super.onPostExecute(result); // Конвертируем JSON формат и выводим данные в текстовом поле try < JSONObject jsonObject = new JSONObject(result); result_info.setText("Температура: " + jsonObject.getJSONObject("main").getDouble("temp")); >catch (JSONException e) < e.printStackTrace(); >> > >

Видео на эту тему

Также вы можете просмотреть детальное видео по разработке данного приложения:

Дополнительный курс

На нашем сайте также есть углубленный курс по изучению языка Java . В ходе огромной программы вы изучите не только язык Java, но также научитесь создавать веб сайты, программы под ПК, приложения под Андроид и многое другое. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Java и создавать на нём полноценные проекты.

Больше интересных новостей

Как стать богатым программистом?

Как стать богатым программистом?

5 soft skills, которые необходимы каждому Senior-разработчику

5 soft skills, которые необходимы каждому Senior-разработчику

Какой язык программирования выбрать для изучения?

Какой язык программирования выбрать для изучения?

Расширения Chrome, которые упростят вашу работу

Расширения Chrome, которые упростят вашу работу

Комментарии (5)

Егор 21 января 2024 в 20:54

Здравствуйте при запуске xml файла грузится и вылетает андроид студио что делать в чем проблема?

Роман 20 мая 2023 в 16:56

Приложение вылетает

Аки 05 марта 2023 в 12:31

«Этот файл нельзя открыть, так как он нарушает Условия использования.»

При открытие ссылки проекта вот что показывает

Алекс 31 октября 2022 в 06:35

Падает при кривом вводе названия города )
Нужно с исключениями ещё поработать

Прохор 13 января 2023 в 19:25

А у меня вылетает при введении города, не знаю в чём проблема, вроде делал как на видио.

Роман 06 августа 2022 в 00:10

Как сделать запрос к внешнему API из андроид приложения Kotlin

Пытаюсь написать приложение на андроид для своего сайта. На сайте написал API теперь хочу в приложении получать даныне с этого API. Много гуглил по итогу в голове каша. Все примеры что находил или не работают или плохо рассказывают. Помогите написать запрос к API без всяких приамбул. В чистом виде

Отслеживать

48.7k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков

задан 2 фев 2021 в 4:48

17 2 2 бронзовых знака

Ваш вопрос не совсем понятен, что вы имеете ввиду «в чистом виде»? При разработке приложений под Андроид часто пользуются сторонними библиотеками. Вы уже выбрали, какую библиотеку вы хотите использовать? Вполне можно обойтись без библиотек, но кода выйдет больше. Ваш вопрос задан слишком обобщенно, уточните хотя бы в вопросе о том, есть ли у вас какие-то предпочтения или ограничения по поводу использования сторонних библиотек.

Как в Android получить данные с сервера с помощью Retrofit

Retrofit — популярная и удобная библиотека, которая используется, если приложению необходимо работать с сервером. В этой статье я на очень простом примере рассмотрю основы работы с ней.

Предположим, что на каком-то сервере есть данные. И сервер готов нам выдать эти данные. Чаще всего для этого используется формат json. Вот пример таких данных: https://rawgit.com/startandroid/data/master/messages/messages1.json

Давайте используем Retrofit, чтобы получить в приложении данные из этого файла.

Для начала немного теории.

Конфигурирование Retrofit можно разделить на две части: API интерфейс и билдер. Давайте рассмотрим подробно, кто из них за что отвечает.

Представим себе работу по обмену данными приложения с сервером. Как это происходит? Обычно сервер предоставляет нам какое-то API, т.е. набор методов (он же REST). Если, например, это сервер интернет-магазина, то его API может содержать следующие методы:
getProducts — получить список товаров
getProdut — получить детальные данные о продукте
getOrders — получить список заказов
getOrder — получить детальные данные о заказе
createOrder — создать заказ
и т.д.

Это серверные методы и, чтобы их вызывать, нам необходимо выполнять запросы, которые могут выглядеть, например, так:
http://server/api/v1/getProducts
http://server/api/v1/getProduct
http://server/api/v1/getOrders
http://server/api/v1/getOrder
http://server/api/v1/createOrder
и т.д.

Т.е. у сервера есть какой-то базовый URL — http://server/api/v1/. И к нему просто добавляются имена методов (getProducts, getOrders, и т.д.), чтобы получать ссылки для работы с API методами.

Возвращаемся в приложение. Было бы очень удобно, если бы у нас в приложении был класс ServerApi с методами getProducts, getOrders и т.д. И при вызове этих методов происходил бы вызов соответствующих серверных методов. И Retrofit как раз может создать для нас такой класс. От нас потребуется интерфейс, в котором мы распишем необходимые методы.

Вот пример такого интерфейса:

public interface ServerApi < @GET("getProducts") ListgetProducts(); @GET("getProduct") Product getProduct(long productId); @GET("getOrders") List getOrders(); @GET("getOrder") Order getOrder(long orderId); @POST("createOrder") void createOrder(Order order); >

Этот код немного упрощен. В реальном примере будут дополнительные аннотации и обертки. Но общий смысл он вполне передает. Retrofit создаст класс, который реализует этот интерфейс. Внутри этого класса и будут сгенерированы вызовы к серверу.

А мы в этом интерфейсе можем настроить названия методов и некоторые HTTP штуки, такие как передаваемые параметры (Query), заголовки (Header) и т.п.

Рассмотрим описание метода getProducts подробнее:

@GET("getProducts") List getProducts();

Аннотация GET означает, что HTTP-запрос для getProducts должен быть типа GET. А в качестве параметра для этой аннотации нам необходимо указать имя метода на сервере. Обратите внимание, что здесь не фигурирует базовый URL (http://server/api/v1/). Его мы будем указывать позже, в билдере.

List — это тип возвращаемых данных. Retrofit сам сможет сконвертировать json данные в список объектов Product. Подробнее об этом тоже поговорим во время обсуждения билдера.

Ну и имя метода — getProducts(). В этом примере оно совпадает с именем метода на сервере. Но это необязательно. Т.е. вы вполне можете сделать так

@GET("getProducts") List getProductList();

Теперь имена методов различаются. Вы в коде будете вызывать метод getProductList, а на сервере будет вызываться getProducts.

Переходим к практике. Чтобы использовать в вашем проекте Retrofit, в build.gradle файле, в секции dependencies добавляйте зависимости:

compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0'

Первая строка — это непосредственно Retrofit, а вторая — это его Gson-конвертер.

Она вернет нам json данные, которые представляют из себя список сообщений. Каждое сообщение содержит поля id, time, text и иногда image. Эта ссылка, конечно, не API, а просто текстовый файл, но смысл остается тем же, просто вместо имени метода у нас будет имя файла.

Мы делим ссылку на две части:
«https://rawgit.com/startandroid/data/master/messages/» — базовый URL (будет указан в билдере)
«messages1.json» — имя файла (будет указано в интерфейсе, в GET аннотации)

Мы можем создать интерфейс для работы с этой ссылкой. Там будет только один метод, и он будет возвращать List.

Давайте сначала создадим класс Message.

public class Message < private long id; private long time; private String text; private String image; // getters and setters . >

Его поля соответствуют полям в данных в messages1.json.

Теперь создаем интерфейс:

import java.util.List; import retrofit2.Call; import retrofit2.http.GET; public interface MessagesApi < @GET("messages1.json") Call> messages(); >

В аннотации GET указываем, что к базовому URL надо будет добавить «messages1.json», чтобы получилась нужная нам ссылка.

Обратите внимание на Call. Эта обертка нужна для работы Retrofit. В ней мы указываем, какой тип данных ожидаем получить из messages1.json — т.е. List.

Интерфейс создан, теперь переходим к билдеру:

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://rawgit.com/startandroid/data/master/messages/") .addConverterFactory(GsonConverterFactory.create()) .build();

В билдере мы указываем базовый URL и добавляем Gson конвертер, чтобы Retrofit сам смог сконвертировать json данные в объекты Message. Это минимум настроек, который от нас требуется для нашего простого примера. Для сложных случаев количество параметров может быть больше.

В итоге у нас есть объект Retrofit, который содержит базовый URL и способность преобразовывать json данные с помощью Gson. Мы передаем ему в метод create класс интерфейса, в котором описывали методы.

MessagesApi messagesApi = retrofit.create(MessagesApi.class);

И получаем реализацию MessagesApi от Retrofit. В этой реализации соединены настройки билдера (базовый URL и Gson конвертер) и описания методов из интерфейса (метод messages для получения файла messages1.json). В итоге Retrofit будет брать базовый URL из билдера, присоединять к нему остаток пути, который мы указываем в GET в интерфейсе, и тем самым получит полную ссылку.

Возможно, возникает вопрос, зачем было разделять функционал на билдер и интерфейс. Я могу привести вам пару примеров из своей практики.

1) У интернет-магазина есть два сервера: рабочий (с реальными данными) и тестовый. На обоих развернуто одинаковое API. И есть приложение, которое общается с сервером. Debug-версия приложения должна работать с тестовым сервером и выводить в лог всю информацию об этом. Release-версия работает с рабочим сервером и ничего не выводит в лог.

Эту разницу между Debug и Release версиями можно реализовать двумя разными билдерами. Просто указываем для них разные базовые URL и разные настройки логирования. А интерфейс в обоих случаях будет использоваться один и тот же.

2) Есть сервер с API. И есть приложение, которое вызывает эти методы. На сервере реализована авторизация. Т.е. приложение должно вызвать метод авторизации, получить токен, и затем использовать этот токен при вызове некоторых API методов, которые связаны с пользователем.

В билдере есть возможность использовать специальный обработчик, который будет добавлять токен ко всем вызовам. Но нам надо добавлять токен не ко всем, а только к некоторым вызовам.

В этом случае можно создать два билдера. Первый не будет использовать токен. Реализацию, полученную от этого билдера используем для работы с методами, не требующими токена. А второй билдер будет добавлять токен ко всем вызовам. Реализацию, полученную от этого билдера используем для всех методов, где нужен токен.

Итак, связка интерфейса и билдера дала нам реализацию MessagesApi. Используем ее для получения данных. Вызываем метод messages()

Call> messages = messagesApi.messages(); messages.enqueue(new Callback>() < @Override public void onResponse(Call> call, Response> response) < log("response " + response.body().size()); >@Override public void onFailure(Call> call, Throwable t) < >>);

Метод log — это просто вывод в лог текста

Вызов метода messages вернет нам Call объект. При выполнении этого кода запрос к серверу еще не был отправлен. Call дает нам возможность отправить запрос синхронно (блокируя текущий поток) или асинхронно (с колбэком). Мы выбираем асинхронный вариант: вызываем метод enqueue и создаем для него Callback. Запрос будет выполнен в отдельном потоке, а результат придет в Callback в main потоке.

Если взаимодействие с сервером пройдет успешно, то мы получим результат в метод onResponse в объекте Response. Чтобы добраться до данных, необходимо вызвать метод body() у Response объекта. Это даст нам список сообщений — List. Выводим в лог количество записей в этом списке.

Запустив этот код, мы получим список из 50 записей. Лог покажет следующее:

Если по каким-то причинам не удалось достучаться до сервера, то вместо onResponse, будет вызван метод onFailure. Добавим вывод в лог ошибки, которую вернет нам Retrofit

@Override public void onFailure(Call> call, Throwable t)

Чтобы эмулировать ошибку, мы можем просто поломать имя сервера в базовом URL, который задается в билдере. Например, добавим букву r к rawgit:

https://rrawgit.com/startandroid/data/master/messages/

Запускаем и видим в логе ошибку.

failure java.net.UnknownHostException: Unable to resolve host «rrawgit.com»: No address associated with hostname

Retrofit сообщает, что не нашел сервер rrawgit.com

Если случится какая-то ошибка в процессе работы Retrofit, то она попадет также в onFailure. Например, если сервер вернет некорректные данные, то GsonConverterFactory не сможет их распарсить и выкинет ошибку. А Retrofit отправит ее нам в onFailure.

Есть тип ошибок, который Retrofit умеет обрабатывать без вызова onFailure. Это HTTP-ошибки сервера. Самый простой случай — ошибка 404. Запрос дойдет до сервера, но сервер вместо данных вернет HTTP 404 Not found. Казалось бы — это ошибка и на должна прийти в onFailure. Но нет. onFailure вызывается в случае, когда не удалось достучаться до сервера. А здесь с сервером все ок, он просто вместо данных вернул нам информацию о том, что мы странные и хотим непонятного.

В итоге, ответ сервера мы получим в методе onResponse. И нам надо как-то различать, вернул сервер данные или ошибку. Для этого у объекта Response есть метод isSuccessful.

Перепишем метод onResponse

@Override public void onResponse(Call> call, Response> response) < if (response.isSuccessful()) < log("response " + response.body().size()); >else < log("response code " + response.code()); >>

Если запрос был выполнен успешно (isSuccessfull), то выводим в лог количество полученных записей. Иначе выводим в лог код ошибки.

Снова поменяем базовый URL, чтобы спровоцировать ошибку 404. Добавим лишнюю букву s в слово messages:

https://rawgit.com/startandroid/data/master/messagess/

Запускаем и в логе видим

response code 404

Чтобы получить полный текст ошибки сервера, используйте

response.errorBody().string()

Приведу весь код работы с Retrofit:

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://rawgit.com/startandroid/data/master/messages/") .addConverterFactory(GsonConverterFactory.create()) .build(); MessagesApi messagesApi = retrofit.create(MessagesApi.class); Call> messages = messagesApi.messages(); messages.enqueue(new Callback>() < @Override public void onResponse(Call> call, Response> response) < if (response.isSuccessful()) < log("response " + response.body().size()); >else < log("response code " + response.code()); >> @Override public void onFailure(Call> call, Throwable t) < log("failure " + t); >>);

Разумеется, вам не нужно при каждом запросе к серверу использовать билдер и создавать новый объект MessagesApi. Это делается один раз за время работы приложения и далее объект MessagesApi используется везде, где необходима работа с сервером. Для реализации Singleton подойдет Dagger или любая другая реализация этого паттерна.

На этом пока все, чтобы не перегружать вас информацией. Продолжение в следующем посте.

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *