登录

去注册

登录

注册

去登录

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

每日一问 | RxJava2的一个常用姿势,可能隐藏着坑?

xiaoyang   2020-03-23 23:45   收藏

谈一个RxJava2的常见用法,一般我们用RxJava2,都会在页面中发起网络请求,在onDestory的时候执行Disposable.dispose。

下面看一个案例:

disposable = Observable
                .create(new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                        new Thread() {
                            @Override
                            public void run() {
                                try {
                                    emitter.onNext("1==>" + Thread.currentThread().getName());
                                    Thread.sleep(1000);
                                    emitter.onNext("2==>" + Thread.currentThread().getName());
                                    Thread.sleep(1000);
                                    emitter.onNext("3==>" + Thread.currentThread().getName());
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                emitter.onError(new RuntimeException("lmj123"));
                            }
                        }.start();

                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        throwable.printStackTrace();
                    }
                });

我们写一个最简单的RxJava的代码,正常情况下,执行完成,会执行到onError的Consumer,打印出异常堆栈,肯定是不会崩溃的。

假设我们在

emitter.onError(new RuntimeException("lmj123"));

执行前,点击按钮,执行dispose(这里其实就是模仿onDestory,点击感受更直观):

findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("lmj", "onDestroy");
                disposable.dispose();
            }
        });

问题来了:

  1. 上述代码会崩溃吗,为什么?
  2. 如果会崩溃,是不是我们最常见的RxJava2页面内操作,onDestory dispose()的写法其实是有风险的?
  3. 如果2成立,有什么好的处理方案吗?

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定