1. 程式人生 > 其它 >RxJava之執行緒切換

RxJava之執行緒切換

技術標籤:RxJavaRxJava執行緒切換RxJava之IoRxJava

RxJava執行過程是一個鏈條式的過程,中間可以自由的切換,預設不配置執行緒的時,預設上下游都在主執行緒,事件執行也是同步執行(上游發一次,西安下游就接收一次),如果配置了執行緒切換,則會變成非同步執行
執行緒切換主要用到的操作符

  1. Schedulers.io():代表io操作流,網路操作,檔案流,耗時操作
  2. Schedulers.newThread()常規的建立一個非同步執行緒
  3. Schedulers.computation()代表CPU大量計算所需要的的執行緒
  4. AndroidSchedulers.mainThread():專門為Androidmain執行緒定製的
    上游切換多次,只執行一次,下游切換多次執行多次,如示例2中所示

示例1:

  Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> emitter) throws Exception {

            }
        }).subscribeOn(Schedulers.io())
                .observeOn(
AndroidSchedulers.mainThread()) .subscribe(new Consumer<Object>() { @Override public void accept(Object o) throws Exception { } });

示例2:

    Observable.create(new ObservableOnSubscribe<Object>()
{ @Override public void subscribe(ObservableEmitter<Object> emitter) throws Exception { } }).subscribeOn(Schedulers.io())//todo 給上游設定非同步執行緒,只切換第一次,其他被忽略 .subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())//todo 給下游設定多次,每次都會切換 .observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Object>() { @Override public void accept(Object o) throws Exception { } });

示例3,下載一個圖片進行顯示到ImageView上的過程

  String path="www.baidu.com";
        Observable.just(path)
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(String s) throws Exception {
                      try {
                          return BitmapFactory.decodeResource(getResources()
                                  ,R.drawable.ic_launcher_background);
                      }catch (Exception e){
                          return null;
                      }
                    }
                })
                .observeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Bitmap>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        //開始下載,顯示載入中
                    }

                    @Override
                    public void onNext(Bitmap bitmap) {
                        //載入成功
                    }

                    @Override
                    public void onError(Throwable e) {
                        //載入失敗時
                    }

                    @Override
                    public void onComplete() {
                        //關閉進度框
                    }
                });

中間可以使用map操作符進行圖片的各種變換及日誌的記錄操作,整個流程,鏈路清晰,功能拆分