RXJava Observable 在主线程而不是后台线程上执行

RXJava Observable executing on main thread instead of background thread

我使用 Observable.fromCallable 方法创建了一个 Observable 并订阅了它,如下面的代码片段所示。

Observable<String> stringObservable = Observable.fromCallable(new Callable<String>() {
        @Override
        public String call() throws Exception {
            Thread.sleep(1000);
            return Thread.currentThread().getName();
        }
});

stringObservable.subscribeOn(Schedulers.io());
stringObservable.observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String aDouble) {
                Toast.makeText(SimpleActivity.this, "onNext: " + aDouble, 
                Toast.LENGTH_LONG).show();
            }

            @Override
            public void onError(Throwable e) {
                new AlertDialog.Builder(SimpleActivity.this)
                        .setTitle("Error")
                        .setMessage(e.toString())
                        .show();
            }

            @Override
            public void onComplete() {

            }
        });

上面的代码片段生成了一个 toast,显示 Callable 在主线程上 运行 而不是 Schedulers.io 线程。发生什么事了?

对 Observable 的每个操作都会创建一个新实例,并且不会影响原始实例。因此

stringObservable.subscribeOn(Schedulers.io());

不会影响您下面的代码。

使用它们的正确方法是在链中而不是使用变量。

Observable.fromCallable(new Callable<String>() {
    @Override
    public String call() throws Exception {
        Thread.sleep(1000);
        return Thread.currentThread().getName();
    }
}).subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(String aDouble) {
            Toast.makeText(SimpleActivity.this, "onNext: " + aDouble, 
            Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(Throwable e) {
            new AlertDialog.Builder(SimpleActivity.this)
                    .setTitle("Error")
                    .setMessage(e.toString())
                    .show();
        }

        @Override
        public void onComplete() {

        }
    });