Rxjava從使用到原碼的解析八: Rxjava線程切換

來一個最基本的測試

在主線程中做如下操作

        Log.e(TAG, Thread.currentThread().getName());
        Disposable subscribe = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                Log.e(TAG, "上游線程: " + Thread.currentThread().getName());
                e.onNext("1111");
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "下游線程: " + Thread.currentThread().getName());
            }
        });

輸出的都是主線程如下

E/MainActivity7: main
E/MainActivity7: 上游線程: main
 E/MainActivity7: 下游線程: main

如果做線程調試,使用方法如下

        Log.e(TAG, Thread.currentThread().getName());
        Disposable subscribe = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                Log.e(TAG, "上游線程: " + Thread.currentThread().getName());
                e.onNext("1111");
            }
        })
                .subscribeOn(Schedulers.io())//這個是給上游配置線程,這裏爲子線程
                .observeOn(AndroidSchedulers.mainThread())//這個是給下游配置線程,這裏爲主線程
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.e(TAG, "下游線程: " + Thread.currentThread().getName());
                    }
                });

輸出如下:

 E/MainActivity7: main
 E/MainActivity7: 上游線程: RxCachedThreadScheduler-1
E/MainActivity7: 下游線程: main

 

如果上游和下游切換多次呢

 Log.e(TAG, Thread.currentThread().getName());
        Disposable subscribe = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                Log.e(TAG, "上游線程: " + Thread.currentThread().getName());
                e.onNext("1111");
            }
        })
                //Schedulers.io() 代表耗時操作
                //Schedulers.newThread()
                //Schedulers.computation()cpu大量計算
                .subscribeOn(Schedulers.io())//這個是給上游配置線程,這裏爲子線程
                .subscribeOn(Schedulers.io())//給上游分配多次,只會在第一次切換
                .subscribeOn(AndroidSchedulers.mainThread())//給上游分配多次,只會在第一次切換
                .subscribeOn(AndroidSchedulers.mainThread())//給上游分配多次,只會在第一次切換

                .observeOn(AndroidSchedulers.mainThread())//這個是給下游配置線程,這裏爲主線程
                .observeOn(AndroidSchedulers.mainThread())//給下游分配多次,每次都會切換
                .observeOn(Schedulers.io())//給下游分配多次,每次都會切換
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.e(TAG, "下游線程: " + Thread.currentThread().getName());
                    }
                });
    }

輸出

 E/MainActivity7: main
E/MainActivity7: 上游線程: RxCachedThreadScheduler-3
E/MainActivity7: 下游線程: RxCachedThreadScheduler-4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章