xuy*_*jun 10 android rx-java retrofit rx-android
我用Retrofit
与RxJava
我的Android应用程序,和我的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
我不想写.subscribeOn(Schedulers.newThread())
和
.observeOn(AndroidSchedulers.mainThread())
每个商业方法
我能怎么做?
iag*_*een 17
如果您不想在每次调用时指定所需的线程,则可以创建一个包装器RxJavaCallAdapterFactory
来默认设置您的线程.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它而不是RxJavaCallAdapterFactory.create()
在您的构建器中 -
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(new RxThreadCallAdapter(Schedulers.io(), AndroidSchedulers.mainThread()))
.build();
Run Code Online (Sandbox Code Playgroud)
Til*_*ill 11
要为subscribeOn
您创建默认调度程序,可以将其作为参数直接传递给RxJavaCallAdapterFactory
创建Retrofit
实例时:
new Retrofit.Builder()
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))
.build();
Run Code Online (Sandbox Code Playgroud)
在Retrofit 2.0.0中介绍过
您可以使用它将其减少到一行compose()
.例如,下面是您getConfig()
方法的修改版本.它假设您正在使用retrolambda.
public void getConfig(NetworkSubscriber subscriber) {
Observable<Config> observable = mApi.getConfig();
observable
.compose(this::setupThreads)
.subscribe(subscriber);
}
Run Code Online (Sandbox Code Playgroud)
该setupThreads()
方法如下所示:
private <T> Observable<T> setupThreads(final Observable<T> observable) {
return observable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
Run Code Online (Sandbox Code Playgroud)
一些参考:
归档时间: |
|
查看次数: |
3151 次 |
最近记录: |