使用Rxjava替代Handler實現單純的執行緒切換
阿新 • • 發佈:2019-01-23
標題中所謂單純的執行緒切換是指不攜帶任何資料實現執行緒切換,當然要攜帶資料的話使用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");
}
});
- 使用Observer.empty()和onCompleted()
Observer.empty()的官方註釋:
Returns an Observable that emits no items to the Observer and immediately invokes its onCompleted method
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();