RxJava入門實踐③
最近大家都在學習RXJAVA,作為有理想(mei shi gan)的程序員,RxJava還是沈有必要學習下的。
RXJAVA地址: https://github.com/ReactiveX/RxJava
在RxJava 中,Scheduler ——調度器,相當于線程控制器,RxJava 通過它來指定每一段代碼應該運行在什么樣的線程。RxJava 已經內置了幾個 Scheduler ,它們已經適合大多數的使用場景:
Schedulers.immediate():直接在當前線程運行,相當于不指定線程。這是默認的 Scheduler。
Schedulers.newThread():總是啟用新線程,并在新線程執行操作。
Schedulers.io():I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多,區別在于 io() 的內部實現是是用一個無數量上限的線程池,可以重用空閑的線程,因此多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免創建不必要的線程。
Schedulers.computation():計算所使用的 Scheduler。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個 Scheduler 使用的固定的線程池,大小為 CPU 核數。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。
另外, Android 還有一個專用的 AndroidSchedulers.mainThread() ,它指定的操作將在 Android 主線程運行。
另外使用AndroidSchedulers.mainThread()需要添加
compile ‘io.reactivex:rxandroid:1.1.0’的依賴有了這幾個 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 兩個方法來對線程進行控制了。 * subscribeOn(): 指定 subscribe() 所發生的線程,即 Observable.OnSubscribe 被激活時所處的線程。或者叫做事件產生的線程。 * observeOn(): 指定 Subscriber 所運行在的線程。或者叫做事件消費的線程。
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
//做有些耗時或者運算操作
int i = 2 << 20;//位運算模擬運算操作
subscriber.onNext(i + "");
subscriber.onCompleted();
}
});
observable
.subscribeOn(Schedulers.computation())//指定運算在運算線程
.observeOn(AndroidSchedulers.mainThread())//指定訂閱者在主線程執行結果
.subscribe(subscriber);
指定訂閱者執行
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
如下圖所示:

當然如果你是進行網絡操作或者是耗時的文件操作你可以
Schedulers.io():來指定被訂閱者工作的線程為io線程