(十)【续】网络框架篇(RxJava+OkHttp+Gson)

来源:互联网 发布:原油api最新数据 编辑:程序博客网 时间:2024/06/13 13:03
        在(一)RxJava在Android网络框架中的使用文章中我们已经实现了能成功请求并返回Json的网络框架Demo,能不能再让我们的开发更加高效,实现直接从json2pojo的网络框架。
        
        在Protocol中加入Gson:
                可以看我们是通过Protocol模块将OkHttp和RxJava进行关联,那么加入Gson后又会是什么样子?

以下是先前代码片段:             
/**
* 创建一个工作在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();
}
          首先从上面代码中我们可以看出,在获取到json后,直接通过setData()方法将Json数据传给了订阅者,而如果要实现json2pojo,首先就要保证回调给订阅者的数据是具体的数据类型而不是json字符串,BaseProtocol中的方式是子类公共的,不可能指定特定的某种具体数据类型,在此不妨使用泛型方法并在参数中传入具体数据类型的字节码对象方便Gson解析:
/**
* 创建一个工作在IO线程的被观察者(被订阅者)对象
*
* @param url
* @param method
* @param params
*/
protected <T> Observable<T> createObservable(final String url, final String method, final TreeMap<String, Object> params, final Class<T> clazz) {
return Observable.create(new Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
Request request = XgoHttpClient.getClient().getRequest(url, method, params);
String json = XgoHttpClient.getClient().execute2String(request);
setData(subscriber, json, clazz);
}
}).subscribeOn(Schedulers.io());
}
/**
* 为观察者(订阅者)设置返回数据
*/
protected <T> void setData(Subscriber<? super T> subscriber, String json, Class<T> clazz) {
if (TextUtils.isEmpty(json)) {
subscriber.onError(new Throwable("not data"));
subscriber.onCompleted();
return;
}

T data = mGson.fromJson(json, clazz);

subscriber.onNext(data);
subscriber.onCompleted();
}
        开始测试:
/**
* Get请求
*/
public Observable<GetModel> text_Get() {
String path = "1";
return createObservable(BASE_URL + path, XgoHttpClient.METHOD_GET, null, GetModel.class);
}
mTestProtocol.text_Get()
.compose(this.<GetModel>bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<GetModel>() {
@Override
public void call(GetModel data) {
tv_reuslt.setText("Get Result:\r\n" + data);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
tv_reuslt.setText("Get Error:\r\n" + throwable.getMessage());
}
});
        
效果如下:
           

(本次修改为了读者阅读方便,单独在protocol2包中修改,不影响原Demo)
源码: https://github.com/cn-ljb/rxjava_for_android



 
1 0
原创粉丝点击