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

  • RxJava como bus de eventos en proyecto Android - eliminar evento del bus
  • ¿Dónde se puede encontrar AndroidObservable.fromBroadcast ahora?
  • Sustitución de EventBus por RxJava - N suscriptores siempre escuchando
  • RxJava file.createNewFile () devuelve siempre TRUE
  • Cómo limpiar RxJava fuego y olvidar suscripciones?
  • Introducción a RxJava con sqlite
  • ¿Cuál es la diferencia entre EventBus y RxJava?
  • Combine RxTextView Observable y Retrofit Observable
  • Prueba de unidad JVM con Mockito para pruebas Retrofit2 y RxJava para solicitudes de red
  • Cómo manejar correctamente onError dentro de RxJava (Android)?
  • Cómo utilizar rxandroid para escuchar la actualización de ubicación de gps
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.