一起Talk Android吧(第五百三十八回:RxJava中的线程切换)

文章目录

  • 概念介绍
  • 使用方法
  • 示例代码

各位看官们大家好,上一回中咱们说的例子是"RxJava中的多线程操作",本章回中介绍的例子是"R xJava中的线程切换"。闲话休提,言归正转,让我们一起Talk Android吧!

概念介绍

我们在上一章回中介绍了如何创建多线程,本章回将介绍如何进行线程切换。线程切换是指在主线程和子线程之间进行切换,因为Android只能在主线程中更新UI,所以通过线程切换来更新UI。切换切换也可以通过Andoird的Handler机制实现,我们之前介绍过,这里就不展开讨论了。

使用方法

线程切换也是使用subscribeOn或者observeOn操作符,切换线程时使用不同的参数:

  • 切换到子线程时使用的参数为Schedulers.newThread()
  • 切换到主线程时使用的参数为AndroidSchedulers.mainThread()。

示例代码

Log.d(TAG, "rxJavaEx: "+Thread.currentThread());
Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@io.reactivex.rxjava3.annotations.NonNull ObservableEmitter<String> emitter) throws Throwable {
                Log.d(TAG, "subscribe: "+Thread.currentThread());
                emitter.onNext("Event 1");
                emitter.onNext("Event 2");
                emitter.onComplete();
            }
        })
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Throwable {
                Log.d(TAG, " Observer accept: "+s+" "+Thread.currentThread());
            }
        });

注意:上面程序中使用的AndroidSchedulers类来自rxjava包,而不是rxandroid包,在文件头import包时需要区分这两种包,否则使用rxAndroid包中的类时程序会报编译错误。我的项目在gradle中导入了rxAndroid依赖,因此会有rxJava和rxAndroid两种类型的包,大家的项目可能不会有这种情况。

上面的代码中我们先是把被观察者切换到了子线程运行,然后把观察者切换到主线程运行。编译并且运行该程序,通过结果来检验是否可以在子线程和主线程之间切换。

: rxJavaEx: Thread[main,5,main]
: subscribe: Thread[RxNewThreadScheduler-1,5,main]
:  Observer accept: Event 1 Thread[main,5,main]
:  Observer accept: Event 2 Thread[main,5,main]

从程序的运行结果中可以看到所有的程序运行在主线程main中,被观察者运行在子线程RxNewThreadScheduler-1中,观察者运行在主线程main中。该结果与我们刚才分析的程序逻辑完全一致,表明上面的程序可以实现线程切换功能。

看官们,关于"RxJava中的线程切换"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

你可能感兴趣的:(一起Talk,Android吧,android,rxjava,线程切换,android中更新UI,rxandroid)