RxJava 到底是什么
一个词:异步。
来自仍物线的经典博文总结!
本demo也是参考上面博文写的一个demo,
具体原理和深入的东西我也没有看源码.有能力的同学请去github下载RxJava源码然后深入.
我从应用的角度来分下我当前的这个demo,以及最后又源码奉上!!
国际惯例先来GIF吸引游客….
首先拿讲解下图中的功能部分
四个button 分别代表了四种RxJAVA筛选数据的方法,基本就一句话的事情,都在RXjava中的suscriber中.就是所谓的观察者,注册者.
刚进去的时候如果直接下拉刷新,走rxjava默认取数据的方法没有进行任何筛选
从代码中看rxjava的用法.
第一步,maven库中搜索
compile ‘io.reactivex:rxjava:1.1.0’
compile ‘io.reactivex:rxandroid:1.1.0’
配置gralde
第二步,看图片吧,根据我们的需求获取手机用户
应用列表,用rxjava的方式
建立AppInfoEntity用来封装UI属性
建立presenter获取数据
如下代码片段
public void getAppInfo(int type) {
initRXJavaAppInfo(type).subscribeOn(Schedulers.io())// 获取数据在io线程,
.observeOn(AndroidSchedulers.mainThread())//转换到UI线程.模拟线程切换
.subscribe(new Subscriber<AppInfoEntity>() {
@Override
public void onCompleted() {
appInfoView.stopRefresh();
appInfoView.bindCompeled();
}
@Override
public void onError(Throwable e) {
appInfoView.stopRefresh4Error();
}
@Override
public void onNext(AppInfoEntity appInfoEntity) {
appInfoView.bindAppInfo(appInfoEntity);
}
});
}
这是什么鬼..慢慢来别急
还有一大片
/** * RXjava获取应用列表 */
private Observable<AppInfoEntity> initRXJavaAppInfo(final int type) {
ob = Observable.create(new Observable.OnSubscribe<AppInfoEntity>() {
@Override
public void call(Subscriber<? super AppInfoEntity> subscriber) {
ArrayList<AppInfoEntity> appList = new ArrayList<AppInfoEntity>();
List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
// 系统应用
} else {
// 客户应用
AppInfoEntity tmpInfo = new AppInfoEntity();
tmpInfo.appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString();
tmpInfo.packageName = packageInfo.packageName;
tmpInfo.versionName = packageInfo.versionName;
tmpInfo.versionCode = packageInfo.versionCode;
tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(context.getPackageManager());
appList.add(tmpInfo);
if (subscriber.isUnsubscribed()) {
return;
} else {
if (type == -1) {
// for debug 用来模拟网络环境加载延时.
try {
Thread.sleep(50);
subscriber.onNext(tmpInfo);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
subscriber.onNext(tmpInfo);
}
}
}
}
if (!subscriber.isUnsubscribed()) {
subscriber.onCompleted();
}
}
});
subscriber = new Subscriber<AppInfoEntity>() {
@Override
public void onCompleted() {
appInfoView.stopRefresh();
appInfoView.bindCompeled();
}
@Override
public void onError(Throwable e) {
appInfoView.stopRefresh4Error();
}
@Override
public void onNext(AppInfoEntity appInfoEntity) {
appInfoView.bindAppInfo(appInfoEntity);
}
};
return ob;
}
用 rxJAVA 首先大家都知道 他是基于观察者模式实现的
所以有两个角色.Observable 被观察者 suscrber 观察者
然后 创建出来这两个对象. 被观察者.suscrbe(观察者),这样他们两个就关联起来了,于是被观察的对象在有某种操作的时候就会触发event告诉观察者….
上面两个方法就是执行完毕了这两个方法
然后来看看上面四个button的筛选数据的方法,其实就是一句话就能筛选了
因为RXjava全部是链式调用
比如take() 取数据的前几条数据
剩余的三个按钮大家自己在源码中找..都在impl里面的实现中.都有关于数据筛选和线程切换的代码.
Rx好用的切换线程可以不用handler把IO线程和UI线程链式调用
这里的代码部分在这里
只要指定RXjava的shadules就能切换线程
具体原理我也没看源码分析.好像是根据他里面的什么map 和lift…大家可以去百度下相关原理…..
还有rx能根据条件筛选数据比如找到一”c”开头的所有的app 并列出来就是 第三个filter的button的对应的实现
public void getAppFilterInfo() {
initRXJavaAppInfo(-filter(new Func1<AppInfoEntity, Boolean>() {
@Override
public Boolean call(AppInfoEntity appInfoEntity) {
return appInfoEntity.getAppName().startsWith("c");
}
}) .subscribeOn(Schedulers.io())// 获取数据在io线程,
.observeOn(AndroidSchedulers.mainThread())//转换到UI线程.模拟线程切换
.subscribe(new Subscriber<AppInfoEntity>() {
@Override
public void onCompleted() {
appInfoView.stopRefresh();
appInfoView.bindCompeled();
}
@Override
public void onError(Throwable e) {
appInfoView.stopRefresh4Error();
}
@Override
public void onNext(AppInfoEntity appInfoEntity) {
appInfoView.bindAppInfo(appInfoEntity);
}
});
}
filter(new Func1<AppInfoEntity, Boolean>() {
@Override
public Boolean call(AppInfoEntity appInfoEntity) {
return appInfoEntity.getAppName().startsWith("c");
}
})
这段filter的链式调用就是对数据进行筛选.我这里过滤了是c开头的app应用
其实项目实战用来过滤null对象是非常好的….
好了分析就到这里吧.
高大上的东西我再去复制点….不然这写的也太水了..
来自网络复制的内容>>>>
哎算了找不见 就这样吧你就凑乎下吧
源码再此处,需要一分,,不好意思啊..有分就打赏点吧没有分可以留言留下邮箱我发给留言的哥们.谢谢>>>>>>>>>>>>>>>>RxAndroidDemo