前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxJava之初体验

RxJava之初体验

作者头像
open
发布2020-03-19 16:39:33
3830
发布2020-03-19 16:39:33
举报

前言:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Open软件开发小组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档