天天看點

Rxjava線程控制(切換 / 排程 )

參考: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