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

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