RxJava之初体验

前言:

RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM

关键词: Asynchronous Sequences Event-based 应用开发归根到底就是对应用流程的管理:先做什么、后做什么、发生某些情况时需要做相应的操作,但随着应用功能的不断叠加,以及使用网络环境的影响,应用的处理流程往往会越来越复杂。例如Android开发中,我们就经常会遇到界面交互与后台网络操作相互混杂的情况,在一个界面中,随着功能的添加与迭代,这些交互与网络操作会不断叠加,这会使得代码混乱,让人无法控制,而RxJava提供了一种对复杂流程的管理方法。

1

关键概念

  • Observable 被观察者:执行操作流程;
  • Observer、Subscriber 观察者:操作流程结束后的调用(异常退出);
  • create、just、from、zip、combine :提供多种方式创建操作流程;
  • map、flatmap 提供执行过程中传递参数的转换操作(1:1,1:n);
  • subscribe() 关联观察者与被观察;
  • Schedulers 设置执行序列所在线程(IO线程、CPU密集计算、UI线程)。

来看一个最简单的例子,通过RxJava实现一个简单的网络图片和文字(JSON数据)加载功能。

2

实现流程

1. Android UI线程不能有网络操作,需要创建一个子线程执行网络操作; 2. JSON解析,得到文字信息和图片URL; 3. 网络图片加载,在UI线程显示图片和文字信息。

3

代码片段

Observable.create(new Observable.OnSubscribe<RequestBean>() { @Override public void call(final Subscriber<? super RequestBean> subscriber) { OkHttpUtils.get("url").execute(new StringCallback() { @Override public void onResponse(boolean isFromCache, String s, Request request, @Nullable Response response) { RequestBean requestBean = JSONTools.parseObject(s, RequestBean.class); subscriber.onNext(requestBean); subscriber.onCompleted(); } }); } }).subscribeOn(Schedulers.io()) // 此处可添加中间处理流程及对象转化操作 .observeOn(AndroidSchedulers.mainThread()).doOnSubscribe(new Action0() { @Override public void call() { mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(true); } }); } }).subscribe(new Subscriber<RequestBean>() { @Override public void onCompleted() { mSwipeRefreshLayout.setRefreshing(false); } @Override public void onError(Throwable e) { Log.d(TAG, "onError: " + e.getMessage()); } @Override public void onNext(RequestBean requestBean) { Log.d(TAG, "onNext: " + requestBean.getReason()); mNewsAdapter.addAll(requestBean.getResult().getData()); } }); } 从代码量上看可能并不会比普通实现少多少(可能还会多一点),但从代码逻辑来看,相比AsyncTask和Handler的实现更加“优雅”,避免了代码的跳转以及设置全局状态量,代码处理逻辑高度内聚。

4

小结

1. RxJava可以完成我们通过AsyncTask及Handler实现的大多数功能,而使用RxJava可以避免创建一些监听状态的全局变量,代码的跳转及“迷之缩进”,让代码更加“优雅”;

2. 通过RxJava的线程管理我们可以细粒度的控制操作流程中每个状态的线程跳转(比如在一个操作流程中,我们可以在IO线程读取数据,CPU密集计算线程做数据处理,然后在UI线程显示结果,而这些我们通过添加几行简单的代码就可以实现);

3. 通过doOnSubscribe()、OnNext()、OnComplete()和OnError(),我们可以轻松地监听被观察者的运行状态,进行相应的处理;

4. RxJava提供了基于Observable序列实现的异步调用,我们可以在Observable的创建时可以添加多个事件,序列化执行,同时,在操作流程中,可以使用map、flatMap将操作对象做1:1、1:N的转化,转化之后的对仍是一个Observable序列,并添加在主序列中(如网络请求数据转化,获取对象的集合属性,使用第三方库是需要对运行结果进行转化后使用)。

Tips

1、RxJava是一个可以处理任何事件的通用框架,你可以在Observable中执行任何操作(网络请求、操作事件、数据库查询、文件读写...),在Observer中执行器响应事件。

2、RxJava仅仅是一个容器,在其中你可以根据需求使用各种第三方库。

参考资料

【给 Android 开发者的 RxJava 详解】

http://gank.io/post/560e15be2dca930e00da1083

【Why you should use RxJava in Android a short introduction to RxJava】

http://blog.feedpresso.com/2016/01/25/why-you-should-use-rxjava-in-android-a-short-introduction-to-rxjava.html

【深入浅出RxJava(一:基础篇)】

http://blog.csdn.net/lzyzsd/article/details/41833541

【RxAndroid 】

https://github.com/ReactiveX/RxAndroid

【RxBinding】

https://github.com/JakeWharton/RxBinding

本文分享自微信公众号 - Open软件开发小组(open_dev),作者:卢震宇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊Android应用Preference组件那点事

    本文主要给大家讲述下本人使用Preference的经验和体会。为了使短信项目和系统之间的耦合度更低,使用简单,达到代码可读性更好,又要达到策划的需求,根据以上...

    open
  • [Json框架选型]Android开发中应该使用哪一种主流json框架?

    前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料...

    open
  • Java设计模式精讲(一):责任链模式

    这篇分享作为一个系列分享的第一篇,主要和大家一起学习一下java设计模式方面的基础,我们现在的安卓开发主要还是基于java语言,所以掌握java...

    open
  • 4.线程池

    六月的雨
  • Java多线程编程

    1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂。在多线程访问共享数据的时候,这部分代码需要特别的注意。线程之间的交互往往...

    Java团长
  • Lock

    从上面的synchronized释放锁可以看出,只有synchronized代码块执行完毕或者异常才会释放,如果代码块中的程序因为IO原因阻塞了,那么线程...

    爱撒谎的男孩
  • 第二十五天 多线程-常用方法&线程池【悟空教程】

    System.out.println(getName() + " ==== " + i );

    奋斗蒙
  • Python入门进阶教程-多线程与多进程

    如何同时对一个文件夹开启四个任务同时处理不同的任务,而不会产生冲突?接下来我们一起了解一下多线程和多进程。

    知秋小一
  • (65) 线程的基本概念 / 计算机程序的思维逻辑

    在之前的章节中,我们都是假设程序中只有一条执行流,程序从main方法的第一条语句逐条执行直到结束。从本节开始,我们讨论并发,在程序中创建线程来启动多条执行流,并...

    swiftma
  • Java多线程详解

    每个运行的程序就是一个进程,当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个进程。

    二十三年蝉

扫码关注云+社区

领取腾讯云代金券