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

        在 (一)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)



 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值