2.4 RxJava系列7(最佳实践)
2.3 RxJava系列6(从微观角度解读RxJava源码)
2.2 RxJava系列2(基本概念及使用介绍)
2.1 RxJava系列1(简介)
1.1Rxjava之变换操作符
=========
2.4 RxJava系列7(最佳实践)
2.3 RxJava系列6(从微观角度解读RxJava源码)
2.2 RxJava系列2(基本概念及使用介绍)
2.1 RxJava系列1(简介)
2.4 RxJava系列7(最佳实践)
前言
因此这篇文章只是简单的通过两个例子介绍了RxJava在生产环境中的使用。不过本篇中的每个例子我都配上了完整的代码。
按照计划这一期是要介绍RxJava框架结构和设计思想的,但是考虑到Netflix将在十月底发布RxJava2.0正式版;因此决定将RxJava框架结构和设计思想分析放到2.0正式版发布后再做。后续我也会有一系列的文章来介绍RxJava1.x和2.x的区别。
示例一、获取手机上已安装的App
第一个例子 这里我主要讲讲如何通过RxJava实现核心功能。
首选我们需要调用系统api来获取所有已安装的app,所以在OnSubscribe
的call
方法中调用getApplicationInfoList()
。
但是getApplicationInfoList()
获取的数据并不能完全满足我们的业务需求:
- 由于我们只需要展示手机上已安装的第三方App,因此需要通过
filter
操作符来过滤掉系统app; ApplicationInfo
并不是我们所需要的类型,因此需要通过map
操作符将其转换为AppInfo
;- 由于获取
ApplicationInfo
、过滤数据、转换数据相对比较耗时,因此需要通过subscribeOn
操作符将这一系列操作放到子线程中来处理; - 而要将信息展示在页面上涉及到UI操作,因此需要通过
observeOn
操作符将onNext
、onCompleted
、onError
调度到主线程,接着我们在这些方法中更新UI。
下面是核心代码:
final PackageManager pm = MainActivity.this.getPackageManager();
Observable.create(new Observable.OnSubscribe<ApplicationInfo>() {
@Override
public void call(Subscriber<? super ApplicationInfo> subscriber) {
List<ApplicationInfo> infoList = getApplicationInfoList(pm);
for (ApplicationInfo info : infoList) {
subscriber.onNext(info);
}
subscriber.onCompleted();
}
}).filter(new Func1<ApplicationInfo, Boolean>() {
@Override
public Boolean call(ApplicationInfo applicationInfo) {
return (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0;
}
}).map(new Func1<ApplicationInfo, AppInfo>() {
@Override
public AppInfo call(ApplicationInfo applicationInfo) {
AppInfo info = new AppInfo();
info.setAppIcon(applicationInfo.loadIcon(pm));
info.setAppName(applicationInfo.loadLabel(pm).toString());
return info;
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<AppInfo>() {
@Override
public void onCompleted() {
mAppListAdapter.notifyDataSetChanged();
mPullDownSRL.setRefreshing(false);
}
@Override
public void onNext(AppInfo appInfo) {
mAppInfoList.add(appInfo);
}
})