迷无踪,山涧偶遇小和尚

2017-07-29  本文已影响0人  李汪汪汪侠

RxJava 日常,今天填这个坑。

线程控制

对上下游的线程进行控制

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

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

                Log.d("rxjava","thread :" +Thread.currentThread().getName());
                e.onNext(1);
            }
        });
        Consumer<Integer> consumer = new Consumer<Integer>() {
            @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<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                Log.d("rxjava","thread :" +Thread.currentThread().getName());
                e.onNext(1);
            }
        });
        Consumer<Integer> consumer = new Consumer<Integer>() {
            @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内置了一些线程供选项我们使用:

有一个坑

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


Over,谁都有几段故事。


没有?想想那个谁
上一篇下一篇

猜你喜欢

热点阅读