Retrofit结合RxAndroid

Retrofit基本是一个业务请求,对应一个接口方法,因为其返回值不支持泛型,只能是具体的类。好处是结构清楚,缺点是业务请求就耦合的网络接口,如果以后想分离网络就很麻烦。而且开发人员还要同时定义每个业务的请求接口,和具体的请求方式,对于大型APP,工作量很大,而且容易出错。

本文主要介绍如何对Retrofit2.0+RxAndroid封装成网络层,对业务使用隔离,使用者不需要知道网络框架使用的是哪种技术,只需要使用通用的接口,即可实现不同业务请求的调用。

@GET(ACTION_URL)
<T extends BaseResult> Observable<T> requestNetwokData(@Query("a") String type, @QueryMap Map<String, String> options);
下面是变相的实现方式,基本技术不变,只是在服务器返回数据时做了一个简单的处理。

1. 返回的数据使用OKHttp原始的类型ResponseBody

2. 数据返回后,通过RxAndroid的map方法,强制根据调用者要求的类型进行转换

@GET(ACTION_URL)
Observable<ResponseBody> requestNetwokData(@Query("a") String type, @QueryMap Map<String, String> options);
public void startRequest(ServiceMap serviceMap, Map<String, String> paramMap) {
    NetworkResult networkResult = new NetworkResult();
    networkResult.mServiceMap = serviceMap;
    Observable<ResponseBody> observable = mHttpApi.requestNetwokData(serviceMap.getmServiceType(), paramMap);
    subscribeOn(networkResult, observable);
}
private void subscribeOn(final NetworkResult networkResult, final Observable<ResponseBody> observable) {
    Subscription subscription = observable.subscribeOn(Schedulers.io())
            // subscribe()调用后而且在事件发送前执行
            // 默认情况下,doOnSubscribe()执行在subscribe()发生的线程
            // 如果在doOnSubscribe()之后有subscribeOn()的话,它将执行在离它最近的subscribeOn()所指定的线程
            .doOnSubscribe(new Action0() {
                @Override
                public void call() {
                    postNetSubscribe(SubscribeNetwork.TAG_NET_ONSTART, networkResult);
                }
            }).subscribeOn(AndroidSchedulers.mainThread())
            .map(new Func1<ResponseBody, BaseResult>() {
                @Override
                public BaseResult call(ResponseBody resBody) {
                    NLog.e("retrofit", "map thread " + Thread.currentThread());
                    try {
                        return JSON.parseObject(resBody.bytes(), networkResult.mServiceMap.getmClazz());
                    } catch (IOException e) {
                        e.printStackTrace();
                        return null;
                    }
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<BaseResult>() {
                @Override
                public void onCompleted() {
                    postNetSubscribe(SubscribeNetwork.TAG_NET_ONCOMPLETED, networkResult);
                }

                @Override
                public void onError(Throwable e) {
                    postNetSubscribe(SubscribeNetwork.TAG_NET_ONERROR, networkResult);
                }

                @Override
                public void onNext(BaseResult baseResult) {
                    NLog.e("retrofit", "onNext thread " + Thread.currentThread());
                    networkResult.mResponseResult = baseResult;
                    postNetSubscribe(SubscribeNetwork.TAG_NET_ONRESULT, networkResult);
                }
            });
    // add方法内做了线程同步功能
    mCompositeSubscription.add(subscription);
}
    上面就是本人的变相处理方式,哪位大神有好的方法,欢迎指导。

 

    RxBus post方法遇到的坑

    1. 使用post方法通知订阅者,网络数据返回

/**
 * 给订阅者发网络处理消息
 * @param tag
 * @param networkResult
 */
private void postNetSubscribe(String tag, @NonNull NetworkResult networkResult) {
    if (networkResult.mResponseResult == null) {
        // 保证mResponseResult永远都不为null
        networkResult.mResponseResult = new BaseResult();
    }
    RxBus.get().post(tag, networkResult);
}
2. 通用的订阅者,接收网络数据返回,再分发给不同界面

public class SubscribeNetwork {
    private INetworkListener networkListener;
    public SubscribeNetwork(INetworkListener listener) {
        this.networkListener = listener;
    }
    public void register() {
        // 网络请求处理结果监听
        RxBus.get().register(this);
    }
    
    public void unregister() {
        // 解除网络处理结果监听
        RxBus.get().unregister(this);
    }
    
    @Subscribe(tags = {@Tag(TAG_NET_ONRESULT)})
    public void subscribeNetResult(NetworkResult networkResult) {
        if (networkListener != null) {
            networkListener.onNetResult(networkResult);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值