Android响应式编程之RxAndroid应用分析



一、引言

响应式编程并不仅是另外一套 API 规范。它是一种全新的并且非常有用的代码规范。“RxJava” 是一个能在 Android 上使用的响应式编程的实现。Android 是一个开始探索响应式编程世界的极佳平台。尤其是使用 “RxAndroid” 后,事情变得更加简单。“RxAndroid” 是一个将异步 UI 事件封装成更像 RxJava 风格的公共库。RxAndroid是RxJava的扩展, 更好的兼容了Android特性,比如主线程,UI事件等。

二、RxAndroid介绍

RxAndroid是RxJava在Android平台的一个版本,实现的功能几乎都是一样的,只是多了线程调度。设计思想就是用观察者的模式去解决问题,把一个被观察对象让一个或多个观察者去监听他的变化。

RxAndroid的核心就是“异步”两个字,其最关键的东西就是三个:

  • Observable:被观察者,也就是我们实际上要操作的对象
  • Observer:观察者,他还有很多的子类
  • Subscriber:订阅,绑定两者

能够监听到的被观察者的行为:

  • Action:行为,目前只找到用到onComplete
  • Function:功能,一般用它来进行对象的转换
  • BiFunction:另一种功能,我目前只发现用在reduce方法中,具体之后在看
  • Consume:应该可以叫做执行者,可以用来回调中间的一些操作,例如onError
  • BiConsumer:也一样,用在doOnEvent中

GitHub: RxAndroid

三、RxAndroid应用

3.1 添加依赖

implementation 'io.reactivex.rxjava2:rxandroid:2.x.x'   //V2.1.0

虽然最新已是V2.1.0,但在项目中,用的还是比较旧的版本:

compile 'io.reactivex:rxandroid:1.2.0'

3.2 封装接口

    public static Observable<BaseResponse> register(final String account, final String password, final String email) {
        return Observable.create(new Observable.OnSubscribe<BaseResponse>() {
            @Override
            public void call(final Subscriber<? super BaseResponse> subscriber) {
                String tmpPwd = paramsPwdMd5(password);
                RequestParams params = new RequestParams(Constants.CCHIP_BASE_URL + "user/register");
                params.addQueryStringParameter("account", account);
                params.addQueryStringParameter("password", tmpPwd);
                params.addQueryStringParameter("email", email);
                post(params, new Callback.CommonCallback<String>() {

                    @Override
                    public void onSuccess(String result) {
                        BaseResponse response = gson.fromJson(result,
                                new TypeToken<BaseResponse>() {
                                }.getType());

                        subscriber.onNext(response);
                    }

                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {
                        subscriber.onError(ex);
                    }

                    @Override
                    public void onCancelled(CancelledException cex) {

                    }

                    @Override
                    public void onFinished() {
                        subscriber.onCompleted();
                    }
                });

            }
        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());

    }

其实这段代码干了三件事:

  • 创建被观察者对象oble
  • 创建观察者oser
  • 连接观察者和被观察者

3.3 应用层调用

     ClinetApi.register(account, password, email).subscribe(new Subscriber<BaseResponse>() {
            @Override
            public void onCompleted() {
                dismissLoadingDialog();
            }

            @Override
            public void onError(Throwable e) {
                dismissWithFailure(R.string.error_network_abort);
            }

            @Override
            public void onNext(BaseResponse baseResponse) {
                if (baseResponse.success()) {
                    EventObject eventObject = new EventObject(Constants.EVENT_BUS_ACTION_REGISTER_SUCCEED);
                    Bundle bundle = new Bundle();
                    bundle.putString(Constants.EVENT_BUS_BUNDLE_REGISTER_DATA, mEtUser.getText().toString().trim());
                    eventObject.setData(bundle);
                    EventBus.getDefault().post(eventObject);

                    mTvAccount.setText(account);
                    showRegisterView();
                }
            }
        });
    }

总结

Rxandroid 说白了就是一个工具,一般用来替代handle 和asynctasic类这种容易引发内存泄露的方法,还有就是用来简化代码逻辑结构。通过实例对RxAndroid有个大体的认识了,也应该体会到它在异步操作,代码链式书写等方面的优势了。但必须说明的是,目前用到的只是冰山一角,还有非常多的内容待挖掘。