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
- rxjava interval () tiempo de reinicio después de algún evento
- Escritura de pruebas síncronas para Rx v2 Flowable
- Cómo manejar la rotación con Retrofit y RxJava / RxAndroid en Actividad?
- Comportamiento de onNext y onComplete
- Android.os.NetworkOnMainThreadException usando rxjava en android
¿Como lo puedo hacer?
- ¿Cómo obtener el último valor de BehaviorSubject?
- Cómo manejar diferentes tipos de errores en Retrofit Rx onError sin instancia fea
- Uso de RxJava dentro de RecyclerView Adapter
- ¿Cómo puedo implementar el equivalente RxJava de INotifyPropertyChanged para hacer un modelo de datos Observable?
- RxJava + Retrofit + sondeo
- Hacer cola de tareas con RxJava en Android
- Problema relacionado con API observable y cancelación de suscripción
- Observable.just () que devuelve Unidad en Kotlin
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