阿正日报

1、关于项目的整体UML类图:

2、主要技术介绍

RxJava:

用一个词概括RxJava,那就是“异步”。当然,在Android的开发过程中,实现异步操作的有很多,Handle,AsyncTask...,那么,为什么越来越多的人开始喜欢RxJava了呢。因为RxJava“简洁”,当逻辑越复杂是,RxJava显得越简洁。

RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。观察者模式面向的需求是:A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在 B 变化的一瞬间做出反应。举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。Android 开发中一个比较典型的例子是点击监听器 OnClickListener 。对设置OnClickListener 来说, View 是被观察者, OnClickListener 是观察者,二者通过 setOnClickListener() 方法达成订阅关系。

RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()

  • onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext() 发出时,需要触发 onCompleted() 方法作为标志。
  • onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
  • 在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

public void getLastZhihuNews() {
        zhihuFragment.showProgressDialog();
        Subscription subscription = ApiManage.getInstence().getZhihuApiService().getLastDaily()
                /*
                * map(): 事件对象的直接变换
                * Func1<T,R>  -> R call(T t)
                * 将T 变换成R并返回
                */
                .map(new Func1<ZhihuDaily, ZhihuDaily>() {
                    @Override
                    public ZhihuDaily call(ZhihuDaily zhihuDaily) {
                        return zhihuDaily;
                    }
                })
                .subscribeOn(Schedulers.io()) // 指定 subscribe() ,即事件发生在 IO 线程
                .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生,事件消费在主线程
                .subscribe(new Observer<ZhihuDaily>() { //订阅,Observer为观察者
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        zhihuFragment.hidProgressDialog();
                        zhihuFragment.showError(e.getMessage());
                    }

                    @Override
                    public void onNext(ZhihuDaily zhihuDaily) {
                        zhihuFragment.hidProgressDialog();
                        //Log.d("ZhihuPresenterImpl", gson.toJson(zhihuDaily));
                        cacheUtil.put(Config.ZHIHU, gson.toJson(zhihuDaily));
                        zhihuFragment.updateList(zhihuDaily);
                        zhihuFragment.getTopStory(zhihuDaily);
                    }
                });
        addSubscription(subscription);

 

posted @ 2017-05-03 16:29  小猪阿正  阅读(108)  评论(0)    收藏  举报