Retrofit + Jsoup = “гремучая смесь”. Реализация архитектуры

200
14 октября 2017, 17:33

Всем привет! Имеется проект приложения в котором сетевые запросы выполняются с помощью Retrofit, а результат парсится через Jsoup. (У сайта нет API, пришлось парсить HTML). Проект делится на 2 package: api и application, между которыми создан интерфейс SomeSiteSDK. Вот пример обращения к API из пакета приложения

SomeSiteSDK.messages().send(userId, "Message text"). execute(new SimpleRequestListener(){
    @Override
    public void onSuccess(){}
    @Override
    public void onError(int type){}
}

Каждый метод класса SomeSDK возвращает экземпляр класса со всеми методами, относящимися к определенной, так скажем, группе, например SDKMessages, SDKFriends. Все методы таких групповых классов на вход принимают параметры запроса (id пользователя, и т.д) и возвращают экземпляр класса (1 класс = 1 запрос). У каждого такого класса есть метод execute куда надо передать интерфейс слушателя запроса. Это может быть или SimpleRequestListener с методом onSuccess, если запрос обычный, для совершения действия и ничего не возвращает или же, что-то возвращающий к примеру FriendsRequestListener, возвращающий коллекцию из моделей Friend в метод onResponse. У любого интерфейса есть метод onError куда приходит тип ошибки.

Теперь самое интересное: во всех классах Request идет обращение к Retrofit, происходит парсинг данных. В пакете api реализован Retrofit, там и DocumentConverterFactory, который каждый ответ от сервера конвертирует в Document через Jsoup, там и интерфейс ApiService в котором лежат все запросы.

Получается такая система

Activity, Fragment > (RequestListener) -> SomeSDK > (Callback) > Retrofit > (RequestListener) > Activity, Fragment

Хорошо ли получилось? Чего бы вы изменили? Было бы замечательно заменить конвертеры с Document на конечные данные, но суть в том, что один запрос к SomeSDK порождвет несколько запросов к Retrofit, а работу с API хочется сделать минимумом кода

Вообщем, жду критики!

READ ALSO
Методы just в RxJava

Методы just в RxJava

Просматривая исходники библиотеки ioreactivex

196
Приложение “Тесты” андроид

Приложение “Тесты” андроид

Есть LinkedHashMap, где ключ - это вопрос, а значение TreeMap, в котором ключи - это ответы, а значение bool(true ответ верный, false нет)

165
Конвертировать из List<Person> в Map<String, List<Person>>

Конвертировать из List<Person> в Map<String, List<Person>>

Есть сущность PersonУ нее есть геттер getId()

190