一、引言
响应式编程并不仅是另外一套 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有个大体的认识了,也应该体会到它在异步操作,代码链式书写等方面的优势了。但必须说明的是,目前用到的只是冰山一角,还有非常多的内容待挖掘。