Android_RxJava_Demo

RxJava 到底是什么

一个词:异步。

来自仍物线的经典博文总结!

本demo也是参考上面博文写的一个demo,
具体原理和深入的东西我也没有看源码.有能力的同学请去github下载RxJava源码然后深入.
我从应用的角度来分下我当前的这个demo,以及最后又源码奉上!!

国际惯例先来GIF吸引游客….

首先拿讲解下图中的功能部分
四个button 分别代表了四种RxJAVA筛选数据的方法,基本就一句话的事情,都在RXjava中的suscriber中.就是所谓的观察者,注册者.

刚进去的时候如果直接下拉刷新,走rxjava默认取数据的方法没有进行任何筛选

Android_RxJava_Demo_第1张图片

从代码中看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线程链式调用
这里的代码部分在这里

Android_RxJava_Demo_第2张图片

只要指定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

你可能感兴趣的:(异步,subscribe,rxandroid,rxjava,Observele)