迷无踪,山涧偶遇小和尚

RxJava 日常,今天填这个坑。

线程控制

对上下游的线程进行控制

平时写的代码都运行在主线程中,当我们使用RxJava的时候,像这样:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(@NonNull ObservableEmitter e) throws Exception {

                Log.d("rxjava","thread :" +Thread.currentThread().getName());
                e.onNext(1);
            }
        });
        Consumer consumer = new Consumer() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                Log.d("rxjava","thread :" +Thread.currentThread().getName());

            }
        };
        observable.subscribe(consumer);
    }

输出结果两个都是main,所以在默认情况下上下是在同一个线程工作的。
想想,那可不行,这有很多业务都是需要在子线程执行耗时操作,主线程更新UI的,咋办呢?

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(@NonNull ObservableEmitter e) throws Exception {

                Log.d("rxjava","thread :" +Thread.currentThread().getName());
                e.onNext(1);
            }
        });
        Consumer consumer = new Consumer() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                Log.d("rxjava","thread :" +Thread.currentThread().getName());

            }
        };
        observable.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(consumer);
    }

这样写的话就可以做到了,输出结果为RxNewThreadScheduler-2和main。
可以看到只是对subscribeOn(Schedulers.newThread()和observeOn(AndroidSchedulers.mainThread())进行了设置。这样上游就在子线程执行,下游会在主线程工作。
值得注意的是:这玩意不论你怎么来回调用,只会保留第一次你设置时候的属性。

内置线程,RxJava内置了一些线程供选项我们使用:

  • Schedulers.io()
    代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
  • Schedulers.computation()
    代表CPU计算密集型的操作, 例如需要大量计算的操作
  • Schedulers.newThread()
    代表一个常规的新线程
  • AndroidSchedulers.mainThread()
    代表Android的主线程

有一个坑

当我们在执行流的过程中退出了这个Activity,当流回到主线程更新UI的时候傻眼了,都jier没了,于是程序就崩溃了。解决办法:调用Disposable的dispose()。当然如果有很多Disposable的情况下,可以使用CompositeDisposable容易,把Disposable这家伙add进去,然后在需要的时候调用CompositeDisposable.clear() 就可以了。


Over,谁都有几段故事。


迷无踪,山涧偶遇小和尚_第1张图片
没有?想想那个谁

你可能感兴趣的:(迷无踪,山涧偶遇小和尚)