Hilo predeterminado de actualización

Yo uso Retrofit con RxJava en mi aplicación de Android, y mi código:

 public void getConfig(NetworkSubscriber subscriber) { Observable<Config> observable = mApi.getConfig(); observable.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); } public void getCode(String mobile, int type, NetworkSubscriber subscriber) { Observable<BaseMessageEntity> observable = mApi.getCode(mobile, type); observable.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); } 

Y no quiero escribir .subscribeOn(Schedulers.newThread()) y .observeOn(AndroidSchedulers.mainThread()) cada método de negocio

¿Como lo puedo hacer?

Si no desea especificar los subprocesos que desea en cada llamada, puede crear un contenedor alrededor de RxJavaCallAdapterFactory para establecer sus subprocesos por defecto.

 public class RxThreadCallAdapter extends CallAdapter.Factory { RxJavaCallAdapterFactory rxFactory = RxJavaCallAdapterFactory.create(); private Scheduler subscribeScheduler; private Scheduler observerScheduler; public RxThreadCallAdapter(Scheduler subscribeScheduler, Scheduler observerScheduler) { this.subscribeScheduler = subscribeScheduler; this.observerScheduler = observerScheduler; } @Override public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { CallAdapter<Observable<?>> callAdapter = (CallAdapter<Observable<?>>) rxFactory.get(returnType, annotations, retrofit); return callAdapter != null ? new ThreadCallAdapter(callAdapter) : null; } final class ThreadCallAdapter implements CallAdapter<Observable<?>> { CallAdapter<Observable<?>> delegateAdapter; ThreadCallAdapter(CallAdapter<Observable<?>> delegateAdapter) { this.delegateAdapter = delegateAdapter; } @Override public Type responseType() { return delegateAdapter.responseType(); } @Override public <T> Observable<?> adapt(Call<T> call) { return delegateAdapter.adapt(call).subscribeOn(subscribeScheduler) .observeOn(observerScheduler); } } } 

Y luego usarlo en lugar de RxJavaCallAdapterFactory.create() en su constructor –

 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(new RxThreadCallAdapter(Schedulers.io(), AndroidSchedulers.mainThread())) .build(); 

Puede reducirlo a una línea utilizando compose() . Por ejemplo, a continuación se muestra una versión modificada del método getConfig() . Asume que usted está utilizando retrolambda.

 public void getConfig(NetworkSubscriber subscriber) { Observable<Config> observable = mApi.getConfig(); observable .compose(this::setupThreads) .subscribe(subscriber); } 

El método setupThreads() sería así:

 private <T> Observable<T> setupThreads(final Observable<T> observable) { return observable .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()); } 

Algunas referencias:

  • RxJava Wiki – Operadores de Transformación
  • Dan Lew blog post – No romper la cadena: el uso de RxJava compose () operador

Para tener un planificador predeterminado para subscribeOn , puede pasarlo como un argumento directamente al RxJavaCallAdapterFactory al crear la instancia de Retrofit :

 new Retrofit.Builder() .client(okHttpClient) .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) .build(); 

Se presentó en Retrofit 2.0.0

  • Suscribir 2 diferentes Observable y onNext ambos?
  • InterruptedIOException al cambiar de mainThread () a io ()
  • Retrofit con rxjava manejando excepciones de red a nivel mundial
  • RxJava Observable a Completable, cómo evitar toBlocking ()
  • ¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
  • Compartiendo RxBindings Eventos observables entre múltiples suscriptores
  • RxJava: encadenamiento de observables
  • RxJava - Encadenamiento de solicitudes y actualización de la interfaz de usuario
  • RxJava: Cómo convertir Lista de objetos en Lista de otros objetos
  • Operadores RxJava
  • Android: Realm.getInstance (context) devuelve una instancia de dominio ya cerrada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.