參考:https://www.jianshu.com/p/5225b2baaecd
為什麼要進行RxJava線程控制(排程 / 切換)?
在 RxJava模型中,被觀察者 (Observable) / 觀察者(Observer)的工作線程 = 建立自身的線程
即,若被觀察者 (Observable) / 觀察者(Observer)在主線程被建立,那麼他們的工作(生産事件 / 接收& 響應事件)就會發生在主線程
因為建立被觀察者 (Observable) / 觀察者(Observer)的線程 = 主線程
是以生産事件 / 接收& 響應事件都發生在主線程
對于一般的需求場景,需要在子線程中實作耗時的操作;然後回到主線程實作 UI操作。
應用到 RxJava模型中,可了解為:
- 被觀察者 (Observable) 在 子線程 中生産事件(如實作耗時操作等等)
- 觀察者(Observer)在 主線程 接收 & 響應事件(即實作UI操作)
為了解決上述沖突,即實作 真正的異步操作,我們需要對RxJava進行 線程控制(也稱為排程 / 切換)
private void fuc1() {
Observable.just("head.png", "icon.png")
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String s) throws Exception {
//網絡擷取
Log.i(TAG, "apply:----------->1 " + Thread.currentThread().getName());
return Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
}
})
.subscribe(new Consumer<Bitmap>() {
@Override
public void accept(Bitmap bitmap) throws Exception {
// 子線程
Log.i(TAG, "apply:----------->2 " + Thread.currentThread().getName());
// imageView.setIamgeView(bitmap)
}
});
輸出:
hongxue: apply:----------->1 main
hongxue: apply:----------->2 main
hongxue: apply:----------->1 main
hongxue: apply:----------->2 main
我們知道需要在子線程中實作耗時的操作,然後回到主線程實作 UI操作。
線程類型:
在 RxJava中,内置了多種用于排程的線程類型
類型 | 含義 | 應用場景 |
---|---|---|
Schedulers.immediate() | 目前線程 = 不指定線程 | 預設 |
AndroidSchedulers.mainThread() | Android主線程 | 操作UI |
Schedulers.newThread() | 正常新線程 | 耗時等操作 |
Schedulers.io() | io操作線程 | 網絡請求、讀寫檔案等io密集型操作 |
Schedulers.computation() | CPU計算操作線程 | 大量計算操作 |
修改代碼:
//被觀察者 (Observable) 在 子線程 中生産事件(如實作耗時操作等等)
//觀察者(Observer)在 主線程 接收 & 響應事件(即實作UI操作)
private void fuc1() {
// url -----> Bitmap
Observable.just("head.png", "icon.png")
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String s) throws Exception {
//網絡擷取
Log.i(TAG, "apply:----------->1 " + Thread.currentThread().getName());
return Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
// .subscribeOn(Schedulers.newThread())
.subscribe(new Consumer<Bitmap>() {
@Override
public void accept(Bitmap bitmap) throws Exception {
// 子線程
Log.i(TAG, "apply:----------->2 " + Thread.currentThread().getName());
// imageView.setIamgeView(bitmap)
}
});
}
輸出結果:
hongxue: apply:----------->1 RxCachedThreadScheduler-1
hongxue: apply:----------->1 RxCachedThreadScheduler-1
hongxue: apply:----------->2 main
hongxue: apply:----------->2 main