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

如果你还没有接触RxJava或者刚刚开始使用它的话,那么你会发现始终会有很多新东西要学习。我们在GO-JEK的App中需要执行很多的异步操作,而且我们无法在UI的速度和流畅性上妥协

编写大量多线程的Android App是一件很困难和很有挑战的事情,因为在这个过程中有很多的部件需要进行处理。这连同一些其他的原因促使我们在Android App中大量使用了RxJava。

在本文中,我们将会讨论如何使用RxJava真正的多线程功能,它会让复杂的App开发过程再次变得简单、容易和有趣。本文中的所有代码样例都会关注RxJava,但是文中讨论的概念同样适用于其他的反应式扩展(Reactive Extension)

为何要进行反应式编程?

任何一篇关于RxJava的文章都会包含一个“为什么要进行反应式编程”的章节,我们也不打算破坏这个约定。在Android中采用反应式的方式构建App会带来多项收益,接下来我们讨论几项你真正值得关注的好处。

不再会有回调地狱

如果你已经做过一段时间的Android开发的话,你肯定会明白嵌套回调会快速地让所有事情失去控制。

 

如果你想按顺序执行一系列的异步操作并且下一步操作的行为要依赖于上一步操作的结果,那么你就会遇到这种状况。几乎瞬间,代码就会变得超级丑陋和难以管理。

简单的错误处理

在命令编程的世界中,如果你要执行大量复杂、异步的操作,错误可能会在任意的地方出现,为了处理这些场景,我们就需要将大量补丁式的代码到处放得到处都是,从而形成大量重复和繁琐的代码。

超级简单的多线程

我们都知道(私下也承认)在Java中编写多线程代码有多困难。在后台线程中执行一段代码并在UI线程中获取结果,这听起来似乎很简单,但实际上有很多复杂的情况需要处理。

通过使用RxJava,你可以非常容易地在任意线程中执行复杂的操作,它会维持适当的状态同步,并能够让你无缝地切换线程。

RxJava所带来的好处是无穷无尽的,就此可以谈论几个小时,但是现在我们要更深入地探索一下它为多线程编程所带来的真正威力。

默认情况下,RxJava并不是多线程的

是的,你没有看错。RxJava默认情况下跟多线程一点关系都没有。在官方网站上,RxJava是这样定义的:

借助observable序列,在Java VM上组合异步和基于事件的程序的库。

看到“异步”这个词,很多人就形成了一种误解,认为RxJava默认就是多线程的。的确,它支持多线程并且提供了一些强大的特性以便于我们执行异步操作,但是不能就此断定它的默认行为就是多线程的。

如果你多少了解一些RxJava的话,会知道它的基本构造为:

源Observable

一个或多个操作符(Operator)

目标Subscriber

Observable.just(1, 2, 3, 4, 5) .doOnNext(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { println("Emitting item on: " + currentThread().getName()); } }) .map(new Function<Integer, Integer>() { @Override public Integer apply(@NonNull Integer integer) throws Exception { println("Processing item on: " + currentThread().getName()); return integer * 2; } }) .subscribeWith(new DisposableObserver<Integer>() { @Override public void onNext(@NonNull Integer integer) { println("Consuming item on: " + currentThread().getName()); } @Override public void onError(@NonNull Throwable e) { } @Override public void onComplete() { } });

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

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