在Android中利用RxJava调度器,我们可以很方便让被订阅者 or 订阅者在不同的线程中各守此责,不多废话基本RxJava在网络框架中的使用是再常见不过的了(调度器的优点也体现在这里)。
网上已经有很多 RxJava+Retrofit 的教程或者Dmeo ,在此就不多说
,其实利用Http同步请求配合RxJava的线程调度器搭建一个异步网络框架本就是so easy(此处可以把RxJava的调度器假设为一个线程池,但实际上远不光如此)。
一个最基本的网络请求(Get):
mTestProtocol.text_Get() // (1)
.compose(this.<String>bindToLifecycle()) // (2)
.observeOn(AndroidSchedulers.mainThread()) // (3)
.subscribe(new Action1<String>() { // (4)
@Override
public void call(String data) { // (5)
tv_reuslt.setText("Get Result:\r\n" + data);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) { // (6)
tv_reuslt.setText("Get Result:\r\n" + throwable.getMessage());
}
});
以上是本人用RxJava+OkHttp实现的一个简单的网络Get请求测试,稍后我会详细介绍OkHttp部分结构。
(1)通过
mTestProtocol的
text_Get()方法获取到一个在IO线程工作的被订阅者
(2)compose()操作符搭配
rxlifecycle框架解决RxJava可能产生的内存泄漏问题,了解详情
请点击这里
(3)指定当订阅被触发时,订阅者工作所在的线程:Android主线程
(4)通过subscribe()方法触发两者之间的订阅关系,Action1是订阅者的一种简写方式等价对应以下代码中的onNext()和onError()方法
new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String data) {
}
};
(5)Action1<String> 对应onNext() , 网络请求成功的回调,data中是服务器返回的Json数据
(6)Action1<Throwable> 对应onError() , 网络请求失败的回调,e中携带请求失败的相关信息
接下来介绍OkHttp部分,也就是(1)中,网络层是如何通过
text_Get()方法返回一个在IO线程工作的被订阅者:
对OkHttp的简单封装就不多介绍,不了解OkHttp使用方法的同学可以在
OKHttp官网或
博客找到相关资料,正如上面所提到的
同步请求+RxJava搭建网络框架层,所以这里我们使用的是OkHttp的同步请求方式execute(),而不是CallBack异步请求,了解RxJava的同学也应当知道RxJava的好处之一就是:为了避免CallBack回调在复杂业务下产生的回调嵌套以及大量标记造成的代码阅读性差、难以维护等问题。
以下是
text_Get()内部的工作代码:
public Observable<String> text_Get() {
String path = "1";
return createObservable(BASE_URL + path, XgoHttpClient.METHOD_GET, null); // (1)
}
/**
* 创建一个工作在IO线程的被观察者(被订阅者)对象
* @param url
* @param method
* @param params
*/
protected Observable<String> createObservable(final String url, final String method, final TreeMap<String, Object> params) {
return Observable.create(new Observable.OnSubscribe<String>() { // (2)
@Override
public void call(Subscriber<? super String> subscriber) {
Request request = XgoHttpClient.getClient().getRequest(url, method, params); // (3)
String json = XgoHttpClient.getClient().execute2String(request); // (4)
setData(subscriber, json); // (5)
}
}).subscribeOn(Schedulers.io());
}
/**
* 为观察者(订阅者)设置返回数据
* */
protected void setData(Subscriber<? super String> subscriber, String json) {
if (TextUtils.isEmpty(json)) { // (6)
subscriber.onError(new Throwable("not data"));
return;
}
subscriber.onNext(json); // (7)
subscriber.onCompleted();
}
(1)text_Get()方法通过createObservable()方法返回一个被订阅者对象
(2)createObservable()方法通过Observable.create()创建并返回被订阅者对象
(3)通过相关网络请求参数生成一个okHttp的Request对象
(4)发送请求,并获取服务器响应数据
(5)调用setData()方法,将服务器请求结果返回订阅者
(6)如果响应数据为空,触发订阅者onError()方法
(7)数据不为空,触发订阅者onNext()方法
一个最基本的RxJava+OkHttp所搭建的网络层就实现了,以下是测试接口的四种请求方式Demo效果图:
加入Gson的网络层搭建已完成,详情请戳:
(十)【续】网络框架篇(RxJava+OkHttp+Gson)