使用Rxjava替代Handler实现单纯的线程切换

标题中所谓单纯的线程切换是指不携带任何数据实现线程切换,当然要携带数据的话使用Rxjava更加常见,相比Handler也简单得多。一般使用Rxjava都会有用create、just、from进行传参的操作,但有时候我不需要传参只是想切换一下线程而已。例如使用服务下载文件完成之后,service的回调方法是在子线程中,我们需要切换到主线程进行解绑服务、弹窗等操作。这在Rxjava中,有如下方法:
1. 使用Observer.create(),在onNext方法中传空值:

Observable
                .create(new Observable.OnSubscribe<Object>() {
                    @Override
                    public void call(Subscriber<? super Object> subscriber) {
                        subscriber.onNext(null);
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        Log.e("Observer.create()", "onNext");
                    }
                });
  1. 使用Observer.empty()和onCompleted()
    Observer.empty()的官方注释:
    Returns an Observable that emits no items to the Observer and immediately invokes its onCompleted method,返回一个不向Observer发送任何条目而立即调用onCompleted()方法的Observable. 因此该方法不会调用onNext()和onError(),看起来会简洁一些。
Observable
                .empty()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Object>() {
                    @Override
                    public void onCompleted() {
                        Log.e("Observer.empty()", "onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("Observer.empty()", "onError");
                    }

                    @Override
                    public void onNext(Object o) {
                        Log.e("Observer.empty()", "onNext");
                    }
                });

但是蛋疼的是,我本来只要一个onComplete,却不得不把onNext(),onError()都摆出来,占着茅坑不拉粑粑,有没有更好的办法呢?有!请继续往下看。
3. 使用empty()+doOnCompleted方法,堪称完美:

Observable
                .empty()
                .observeOn(AndroidSchedulers.mainThread())
                .doOnCompleted(new Action0() {
                    @Override
                    public void call() {
                        Log.e("Observer.empty()", "doOnCompleted");
                    }
                })
                .subscribe();

使用该方法记得最后调用subscribe();

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值