首页 文章

Android上rxjava的默认调度程序

提问于
浏览
11

我正在使用Retrofit为我的异步网络调用返回rxjava Observable .

我发现自己重复以下调用:

someApiCall().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())

好像我总是订阅IO线程并观察Android主线程 . 这似乎是我发现的所有资源的最佳实践 . 也许除了长时间运行的计算之外,我不太明白何时我们想要偏离这种模式 .

有没有办法通过默认subscribeOn和observeOn线程来删除这个样板?

这是rxjava plugins的用例吗? (我找不到很多使用它们的例子 . )

我可以通过弄乱retrofit executors来设置网络边界的默认线程吗?

3 回答

  • 12

    对于 Observable 响应,Retrofit当前将 subscribeOn 设置为 RestAdapter 的HTTP执行程序(提供或默认) . 这样做是为了将RxJava支持填充到现有行为中 .

    2.0的计划是提供明确设置 subscribeOnobserveOn 的默认值的能力(无论是两者,只有一个,还是两者都没有) .

    例如,如果您需要将多个API调用链接在一起,那么您不希望总是希望在主线程上进行观察的原因 .

  • 6

    改造版本2.0.0-beta2(2015-09-28)的Change Log显示在后台运行需要subscribeOn() .

    修复:现在,可观察和基于单一的请求执行同步(因此需要subscribeOn()才能在后台运行) .

  • 4

    Yes ,可以删除这两个电话 .

    这是改装适配器类,它自动调度 subscribeOnobservedOn 以在每次调用时不需要样板调用:

    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())
    

    我写了this blog post,详细介绍了这里发生的事情 .

    这将删除两个调用,我认为是样板 . 我认为Jake将后台调用链接在一起的场景并不真正适用,因为在这种情况下我会进行改进同步调用而根本不使用调度程序 .

相关问题