美文网首页
迷无踪,山涧偶遇小和尚

迷无踪,山涧偶遇小和尚

作者: 李汪汪汪侠 | 来源:发表于2017-07-29 01:48 被阅读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内置了一些线程供选项我们使用:

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

    有一个坑

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


    Over,谁都有几段故事。


    没有?想想那个谁

    相关文章

      网友评论

          本文标题:迷无踪,山涧偶遇小和尚

          本文链接:https://www.haomeiwen.com/subject/ivlqlxtx.html