Intereting Posts
Возможно ли добавление / удаление элементов из списка ListView с помощью CursorAdapter? Использование 32-разрядных jni-библиотек на 64-битном Android-устройстве Создайте файл JSON онлайн и получите URL-адрес Как изменить FloatingActionButton между вкладками? При показе диалога я получаю «Не могу выполнить это действие после onSaveInstanceState» Платформы Android SDK между Linux и Windows Как достичь наилучшей производительности с помощью SQLite в Android? Как повторить этот JSON-массив с использованием Java и org.json в Android? Android: что делать с типом MIME приложения / smil Почему имена файлов в выделенной папке не могут содержать специальные символы или начинаться с заглавной буквы? Android 4.1.2 браузер по умолчанию – проблема рендеринга с отключенными полями ввода Android – Интеграция ffmpeg и android-ndk-r9c API местоположения Google Play Service иногда возвращает неправильное местоположение Ошибка вне памяти в эмуляторе Android, но не на устройстве Как установить фиксированное количество строк в android gridView?

Планировщики по умолчанию для rxjava на Android

Я использую Retrofit для возврата rxjava Observable для моих асинхронных сетевых вызовов.

Я повторяю следующее обращение:

someApiCall().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())

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

Есть ли способ удалить этот шаблон, по умолчанию, подписи subscribeOn и observOn?

Является ли это прецедентом для плагинов rxjava ? (Я не могу найти много примеров их использования.)

Могу ли я установить потоки по умолчанию на границе сети, возившись с исполнителями переоснащения ?

Solutions Collecting From Web of "Планировщики по умолчанию для rxjava на Android"

Для Observable ответов Retrofit в настоящее время устанавливает subscribeOn как исполнитель HTTP RestAdapter (либо предоставленный, либо по умолчанию). Это было сделано для поддержки поддержки RxJava в существующем поведении.

План 2.0 заключается в том, чтобы предоставить возможность устанавливать значения по умолчанию как для subscribeOn и для функции observeOn (независимо от того, является ли это одновременно, либо одним, либо нет).

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

В журнале изменений версии Retrofit версии 2.0.0-beta2 (2015-09-28) показано, что subscribeOn () требуется для работы в фоновом режиме.

Исправлено: Наблюдаемое и однонаправленное выполнение запросов теперь ведет себя синхронно (и поэтому для работы в фоновом режиме требуется subscribeOn ().

Да , можно удалить оба вызова.

Вот класс адаптера адаптера, который автоматически планирует как subscribeOn и observedOn чтобы удалить необходимость в шаблонных вызовах в каждом вызове:

 public class RxThreadingCallAdapterFactory extends CallAdapter.Factory { private final RxJava2CallAdapterFactory original; private RxThreadingCallAdapterFactory() { // Always call on background thread original = RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()); } public static CallAdapter.Factory create() { return new RxThreadingCallAdapterFactory(); } @Override public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { return new RxCallAdapterWrapper(original.get(returnType, annotations, retrofit)); } private static class RxCallAdapterWrapper implements CallAdapter<Observable<?>> { private final CallAdapter<?> wrapped; public RxCallAdapterWrapper(CallAdapter<?> wrapped) { this.wrapped = wrapped; } @Override public Type responseType() { return wrapped.responseType(); } @Override public <R> Observable<?> adapt(Call<R> call) { Observable observable = (Observable) wrapped.adapt(call); // Always handle result on main thread return observable.observeOn(AndroidSchedulers.mainThread()); } } } 

Затем используйте этот адаптер при настройке модификации:

 Retrofit.Builder() .baseUrl(...) .addCallAdapterFactory(RxThreadingCallAdapterFactory.create()) 

Я написал этот пост в блоге, который подробно рассказывает о том, что здесь происходит.

Это приведет к удалению обоих вызовов, которые я считаю шаблоном. Я считаю, что сценарий Джейка по объединению фоновых вызовов действительно не применим, потому что в этом случае я бы сделал переоснащение синхронных вызовов и вообще не использовал планировщиков.