1. 程式人生 > >使用Rxjava替代Handler實現單純的執行緒切換

使用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();