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

标签 android rx-android rx-java2

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

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

            }
        });

上面的代码 fragment 生成了一个 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() {

        }
    });

关于android - RXJava Observable 在主线程而不是后台线程上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47704890/

相关文章:

android - 如何登录 Kotlin 的过滤器功能?

java - 在 NASA Worldwind 中实现 XYZ 切片图层

android - 应用程序的顶部栏不隐藏android

android - fragment 的 refcount() 或 autoConnect()

Android 房间数据库表未更新

android - 如何从android中的recyclerView中删除项目

android - 如何在不传入 Retrofit 实例的情况下使用 Retrofit 的 GsonConverter

java - rxJava debounce() 运算符不适用于 Observable.range()

rx-java2 - 使用 RxJava2 连接字符串

java - 调度程序抛出致命异常 - Android 中的 rxJava2