Разве плохо делать сетевые вызовы и обрабатывать ответы в адаптере? - PullRequest
0 голосов
/ 09 июня 2018

Мне было поручено переделать целое приложение в основном на работе.По сути, приложение представляет собой просто ленту, которая содержит несколько типов карт (например, Facebook с картами обновлений, фотокартами, картами контента OG) и т. Д. Я переместил все операции с сетью в один класс.Вы вызываете метод, который содержит требуемый запрос, передавая относительные параметры и Listener.Сетевой вызов выполняется, а затем слушателю передается ответ.

В настоящее время у меня есть класс Fragment, который заполняет представление recycler моим пользовательским адаптером.Класс Fragment взаимодействует с моим сетевым классом, отправляя запросы на нумерацию оконечных точек.Должен ли я иметь прослушиватель адаптера, который связывается с моим фрагментом, например, когда щелкает значок «Мне нравится» на определенной карте viewHolder?Должен ли я сделать так, чтобы фрагмент создал и управлял этим сетевым вызовом?Проблема, которую я должен здесь объяснить, заключается в том, что в случае сбоя сетевого ответа мне нужно сбросить элементы пользовательского интерфейса (например, цвет значка), чтобы уведомить пользователя о том, что его запрос не может быть выполнен в данный момент.Отключение этих элементов - это свойства держателя вида в этой позиции в представлении переработчика.Кажется неправильным передавать всю эту информацию о владельце вида обратно фрагменту, чтобы фрагмент был единственным классом, взаимодействующим с моим сетевым классом.Есть ли что-то не так с тем, что мой адаптер также обрабатывает сетевые запросы.

Например, установите onClickListener на элементе моего держателя вида, при нажатии обновите пользовательский интерфейс и сделайте вызов, а затем ответьте на адаптер.В случае успеха оставьте все как есть, в случае неудачи сбросьте интерфейс.Этот шаблон имеет смысл для меня и отделяет индивидуальную логику представления от фрагмента.Это нормально делать?Многие поиски в Google заставили меня поверить в обратное.Это мое первое бизнес-приложение, и я хочу убедиться, что я следую наилучшим возможным шаблонам.

Мой фрагмент для записи выглядит примерно так

onCreate() {
  networkListener = new NetworkResponseListener() {
    //Process success response based on response code
    onSuccess(JSONObject response, responseCode) 
    onError(Error e, responseCode) // Handle Errors
  }
}

//After scroll listener indicates I need to fetch again
NetworkHelper.makeFeedFetch(networkListener, LastId, GET_FEED_REQUEST_CODE);

Так что, по сути, я бы делал такой же тип сетевого взаимодействия в своем классе адаптера для таких действий, как нажатие на иконку viewHolder и т. Д.,Это приемлемо?

1 Ответ

0 голосов
/ 09 июня 2018

Если вы действительно хотите убедиться, что соблюдаете лучшие шаблоны, вам не следует создавать NetworkCalls из своего фрагмента.Фрагменты или Действия должны быть просто просмотренными объектами, которые показывают данные, которые им предоставляются другими классами, такими как Presenters (если вы следуете MVP) или ViewModels (MVVM).Эти классы также не выполняют прямые сетевые вызовы.

Как правило, мы используем шаблон Repository, который получает данные из удаленных (веб-сервисы, удаленные БД и т. Д.) Или локальных источников (локальная БД).Ваш сетевой класс является кандидатом на источник репозитория.Затем для каждого действия, необходимого для нашей бизнес-логики, мы генерируем сценарий использования, и если для этого варианта использования требуется репозиторий, мы внедряем наш репозиторий в наш сценарий использования.Затем мы внедряем этот вариант использования в наш Presenter или ViewModel.Эта большая часть косвенности может показаться излишней, но она дает легко расширяемый и тестируемый код.Представление Recycler также является представлением, поэтому вам не следует делать сетевые вызовы также и внутри представления Recycler.

Хотя это и не точное решение, ваше

Установите onClickListener на элементе моего держателя представления, при нажатии обновить пользовательский интерфейс и сделать вызов, а затем ответить на адаптер

лучше ИМО.

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