RxJava2+Retrofit2网络请求框架封装及使用
来源:互联网 发布:网络布线教程 编辑:程序博客网 时间:2024/05/23 20:51
最近把RxJava2和Retrofit2学习了一下,并做了一个简单的封装,算是对学习的总结,以及以后的做项目时可以,可以拿来及用。
注意:本篇不说RxJava2 和 Retrofit2的基础使用,只梳理一下封装的步骤,所以适合对RxJava2 和 Retrofit2有一定的了解的 Coder.
先上封装后使用网络请求的代码:
ServiceFactory.getService(LoginService.class) .login() .compose(RxSchedulers.<BaseEntity<User>>ioMain(context)) .subscribe(new BaseObserver<User>(context) { @Override public void onSuccess(User user) { Log.e(TAG, "User: " + user); } });
前言:一个网络请求,一般而言,大概有以下步骤:
1.建立网络链接。
2.请求前的预处理(如:统一处理请求格式、网络判断、ProgressDialog)。
3.取消请求。
4.请求结果预处理,拿到想要的结果。
一般我们响应的数据格式如:
{ "code":1, "msg":"success", "data":{} }我们关心的数据是data,所以对响应结果需要做预处理。
封装步骤:
一、建立链接:
创建Service:写一个ServiceFactory创建Service。主要代码如下:
public class ServiceFactory { public static <T> T getService(String url ,final Class<T> service) { return RetrofitHelper.getRetrofit(url).create(service); } public static <T> T getService(final Class<T> service) { return RetrofitHelper.getRetrofit().create(service); }}
OkHttpClient 和 Retrofit的创建请看底部链接 Demo。
二、请求前的预处理:
我是写了一个线程转换类,并在里面做的请求预处理,如下:
public class RxSchedulers { private static ProgressDialog dialog; /** * @param: [context] * @return: io.reactivex.ObservableTransformer<T,T> * @description: Thread Scheduling. The default is show dialog. */ public static <T> ObservableTransformer<T, T> ioMain(final Context context) { return ioMain(context,true); } /** * @param: [context, isShow] [context,Whether or not show dialog.] * @return: io.reactivex.ObservableTransformer<T,T> * @description: Thread Scheduling. */ public static <T> ObservableTransformer<T, T> ioMain(final Context context, final boolean isShow) { return new ObservableTransformer<T, T>() { @Override public ObservableSource<T> apply(Observable<T> observable) { if (isShow && dialog == null) { dialog = new ProgressDialog(context); dialog.setCancelable(true); dialog.setMessage("加载中..."); } return observable .subscribeOn(Schedulers.io()) .doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(final Disposable disposable) throws Exception { LogUtil.d("doOnSubscribe -- Determine if there is a network and dialog."); if (!NetWorkUtils.isConnectedByState(context)) { disposable.dispose(); LogUtil.d("doOnSubscribe -- There's no network link."); Toast.makeText(context, R.string.toast_network_error, Toast.LENGTH_SHORT).show(); } else { LogUtil.d("doOnSubscribe -- There's a network link."); if (isShow && dialog != null && !dialog.isShowing()) { dialog.show(); dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { LogUtil.i("Dialog Cancel and interrupt network request!"); disposable.dispose(); } }); } } } }) .doFinally(new Action() { @Override public void run() throws Exception { if (dialog != null && dialog.isShowing()) dialog.dismiss(); } }) .observeOn(AndroidSchedulers.mainThread()); } }; }}在doOnSubscribe中做网络请求和Dailog show。在doFinally中做Dialog dismiss 。disposable.dispose做网络取消。
三、结果预处理:
创建一个BaseObserver类,基础Observer,如下:
public abstract class BaseObserver<T> implements Observer<BaseEntity<T>> { private static final String TAG = "BaseObserver"; public static final int SUCCESS_CODE = 1; private Context mContext; protected BaseObserver(Context context) { this.mContext = context.getApplicationContext(); } @Override public void onSubscribe(@NonNull Disposable d) { } @Override public void onNext(@NonNull BaseEntity<T> tBaseEntity) { LogUtil.d(TAG,"onNext"); if (SUCCESS_CODE == tBaseEntity.getCode()) { T t = tBaseEntity.getData(); onSuccess(t); } else { onFail(tBaseEntity.getMsg()); } } @Override public void onError(@NonNull Throwable e) { LogUtil.d(TAG,"onError"); } @Override public void onComplete() { LogUtil.d(TAG,"onComplete"); } public abstract void onSuccess(T t); public void onFail(String msg) { Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); }}
BaseEntity:
public class BaseEntity<T> { private int code; private String msg; private T data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } @Override public String toString() { return "HttpResult{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}'; }}该类中做数据处理,把data从响应数据中分离出来,并提前对错误做处理。
大概基本的思路就这样。
好了,不写了,还有其他事先撤了,希望对您有些许帮助。
再次声明:本篇博客适合有Rxjava2 和 Retrofit2有一定基础的Coder.
拜拜啦!!!真不写了。
Demo地址:Github
阅读全文
0 0
- RxJava2+Retrofit2网络请求框架封装及使用
- Retrofit2+Rxjava2网络请求框架的封装
- 简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装
- rxjava2+rxandroid2+retrofit2 封装网络请求
- Android RxJava2+Retrofit2搭建网络请求框架
- RxJava2+Retrofit2实现网络请求和解析封装
- Retrofit2+RxJava2进行网络请求
- 优雅地封装使用rxjava2+retrofit2发送http请求
- 基于RxJava2+Retrofit2的简单易用网络请求框架
- 简单上手的Retrofit2+Rxjava2网络请求框架
- Android使用Retrofit2.0和RxJava2.0处理网络请求
- Rxjava2和Retrofit2网络库的封装
- RxJava2和Retrofit2实现简单网络请求
- Retrofit2+Rxjava2如何主动取消网络请求
- 最流行的网络请求框架Rxjava2+Retrofit完美封装
- RxEasyHttp一款基于RxJava2+Retrofit2实现简单易用的网络请求框架
- retrofit2+rxjava2封装解析
- 简单封装retrofit2+rxjava2
- java倒计时,使用Timer
- test
- 使用 WebSocket 和 Python 编写日志查看器
- 小知识
- 母牛的故事
- RxJava2+Retrofit2网络请求框架封装及使用
- WebSockets
- Java学习路线图
- 机器学习(二)
- Java多线程编程中Master-Worker模式的详解
- HDU6098 Inversion(RMQ,2017 HDU多校联赛 第6场)
- c++基础入门
- Netty心跳机制
- 彻底根除“无法安装64位版本的Office,因为在您的PC上找到了以下32位程序:”的问题