Intereting Posts
Как изменить цвет фона в приложении для Android WebView скрывает мягкую клавиатуру во время loadUrl (), что означает, что клавиатура не может оставаться открытой при вызове javascript Создание нового набора значков в Android Studio? Правильные варианты использования для Android UserManager.isUserAGoat ()? Как обновить схему таблицы после обновления приложения на Android? Невозможно выполнить dex: несколько файлов dex определяют Lcom / actionbarsherlock / R $ attr Сжатие видео с использованием FFMPEG и JNI Точность акселерометра Android (инерциальная навигация) Android SDK – Media Player Видео с URL-адреса Доступный пользовательский вид в уведомлении на Android 2.3 или ниже Как настроить SSL-сертификаты с помощью Charles Web Proxy и последнего эмулятора Android в Windows? Создание OnDragListener для Google Map v2 Фрагмент Как отключить представление за моим SlidingDrawer в Android? Как создать значок уведомлений \ строка состояния справа? Android-приложение отладчика приложений сбой с прерыванием

Планировщики по умолчанию для 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()) 

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

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