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

迷无踪,山涧偶遇小和尚

作者: 李汪汪汪侠 | 来源:发表于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,谁都有几段故事。


没有?想想那个谁

相关文章

  • 迷无踪,山涧偶遇小和尚

    RxJava 日常,今天填这个坑。 线程控制 对上下游的线程进行控制 平时写的代码都运行在主线程中,当我们使用Rx...

  • 偶遇山涧方池

    偶遇方池于山涧, 水池清浅石悉见。 年久青苔碧如翠, 一树枯枝照水间。 摄影:大毛

  • 学会放下

    老和尚和小和尚过河,河边偶遇一美女也要过河,老和尚将美女背了过去,然后俩和尚继续赶路。小和尚一路沉思,实在受不了,...

  • 《幽梦》古风

    昨夜梦中人,幽香迷墨客。 晨曦入凤台,惊醒无踪迹。

  • 翠山游记(2020.5.4)

    漫步竹海听林语, 嬉戏山涧闻夏息。 偶遇野果品山味, 忆起童年无忧时。

  • 七律.兰(外一首)

    七律·兰 深藏山涧渺无踪,秋节花开香味浓。 青叶浓稠芳草盛,白云疏浅碧湖容。 名流歌咏画中赏,...

  • 阮郎归·无踪无影

    阮郎归·无踪无影 野风狂生(20180406) 无踪无影绝红尘,离情且作真?悄然春暮落花频,夜船迷入津。 ...

  • 七绝·花季

    又是人间四月天,花红柳绿小溪边。 香迷山涧泉流淌,丽影翩翩美若仙。

  • 悠悠我心

    若 有来生 愿做清风 一缕 来无影 去无踪 自由 自在 白天 徜徉于山涧 听泉水 叮咚 夜晚 休憩在山尖 数繁星 ...

  • 山涧

    有涧的地方未必有山,有山的地方必定有涧,而山涧比平川的涧更富于变化:涧边或怪石突兀,或断岩如削,或草木葱茏...

网友评论

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

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