代码之家  ›  专栏  ›  技术社区  ›  Edwin Nyawoli

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

  •  4
  • Edwin Nyawoli  · 技术社区  · 7 年前

    我使用 Observable.fromCallable 方法并订阅它,如下面的代码段所示。

    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,显示可调用的是在主线程上运行的,而不是在调度程序上运行的。io线程。发生了什么事?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Tim Freiheit    7 年前

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

    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() {
    
            }
        });