在Andoid中如何使用RxJava 2进行多线程编程?(2)

如果你运行上面的代码片段的话,你会发现所有的执行过程都在应用的主线程中执行(请关注打印出来的日志中的线程名)。这表明在默认情况下,RxJava是阻塞的。所有的过程都是在代码运行所在的线程上执行的。

额外的福利:想知道doOnNext()是什么吗?它只是一个副作用操作符,能够让你从observable链中脱离出来并执行一些不那么纯的操作,你可以阅读本文了解更多的信息。

让我们开始一些简单的多线程操作

如果我们想要在Android中使用RxJava做一些基本的多线程操作,需要做的就是熟悉SchedulersobserveOn/subscribeOn 操作符,这样的话,就可以开始了。

现在,看一个最简单的多线程用例。假设,我们想要通过网络获取一个Book列表,并且要在应用的UI线程中展现这个列表,我们就采用这个简单直接的用例作为开始。

getBooks().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<Book>() { @Override public void onNext(@NonNull Book book) { // You can access your Book objects here } @Override public void onError(@NonNull Throwable e) { // Handler errors here } @Override public void onComplete() { // All your book objects have been fetched. Done! } });

在这里,有一个getBooks()方法,它会发起网络调用并获取图书列表。网络调用会耗费一定的时间(通常几毫秒到几秒钟的时间),因此,我们使用subscribeOn()并指定Schedulers.io() Scheduler在I/O线程中执行操作。

我们同时还使用了observeOn()操作符和AndroidSchedulers.mainThread() Scheduler,以便于在主线程中消费结果并将图书列表填充到应用的UI之中。这些知识可能你之前已经了解过或使用过了。

不必担心,我们马上就会进入更高级的内容。现在展现的这些内容只是为了确保我们在同一个起跑线上,在深入介绍更深入内容之前能有一个基本的认识。

使用Scheduler

RxJava中的多线程操作主要是由强大的Scheduler集合提供的。在RxJava中,我们无法直接访问或操作线程。如果想要使用线程的话,必须要通过内置的Scheduler来实现。

你可以将Scheduler视为线程或线程池(一个线程的集合),能够执行不同类型的工作

简而言之,如果你需要在特定的线程中执行任务的话,我们就需要此选择恰当的Scheduler,Scheduler接下来会从它的池中获取一个可用的线程,并基于该线程执行任务。

在RxJava框架中有多种类型的Scheduler,但是这里比较有技巧的一点就是为合适的工作选择恰当的Scheduler。如果你没有选择恰当的Scheduler的话,那么任务就无法最优地运行,所以接下来,我们尝试理解每一个Scheduler。

Schedulers.io()

这是由无边界线程池作为支撑的一个Scheduler,它适用于非CPU密集的I/O工作,比如访问文件系统、执行网络调用、访问数据库等等。这个Scheduler是没有限制的,它的线程池可以按需一直增长。

Schedulers.computation()

这个Scheduler用于执行CPU密集的工作,比如处理大规模的数据集、图像处理等等。它由一个有界的线程池作为支撑,线程的最大数量就是可用的处理器数量。

因为这个Scheduler只适用于CPU密集的任务,我们希望限制线程的数量,这样的话,它们不会彼此抢占CPU时间或出现线程饿死的现象。

Schedulers.newThread()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d1e341f4e14e0d4b847772148355d24a.html