Android(安卓)RxHttp在实战中的运用
16lz
2021-01-26
至于RxHttp是什么,在这里就不讲了,有需要的可以前往查看RxHttp详解,Github讲解
RxHttp如何实现像Retrfit+RxJava那样链式多条请求的请移步
本篇主要来看一下在实战中是如何运用的
1、导入相关的库文件
implementation 'com.rxjava.rxhttp:rxhttp:2.1.0' //必须 annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:2.1.0' //注解处理器,生成RxHttp类,必须 implementation 'com.rxjava.rxlife:rxlife-x:2.0.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
2、支持JDK8
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
3、工具类
import android.text.TextUtils;import androidx.fragment.app.FragmentActivity;import com.rxjava.rxlife.RxLife;import java.io.File;import java.util.Map;import java.util.concurrent.TimeUnit;import io.reactivex.ObservableSource;import io.reactivex.Observer;import io.reactivex.android.schedulers.AndroidSchedulers;import io.reactivex.disposables.Disposable;import io.reactivex.functions.Consumer;import io.reactivex.functions.Function;import okhttp3.OkHttpClient;import okhttp3.logging.HttpLoggingInterceptor;import rxhttp.wrapper.annotation.DefaultDomain;import rxhttp.wrapper.entity.Progress;import rxhttp.wrapper.param.RxHttp;/** * FileName: RxhttpUtil * Author: admin * Date: 2020/5/14 15:27 * Description: */public class RxhttpUtil { @DefaultDomain public static String baseUrl = "http://www.baidu.com/"; private static volatile RxhttpUtil instance = null; public static RxhttpUtil getInstance() { if (instance == null) { synchronized (RxhttpUtil.class) { if (instance == null) { instance = new RxhttpUtil(); } } } return instance; } /** * 初始化RxHttp * * @param debug false:非debug模式,true:debug模式 * @param url 更换BaseUrl */ public static void init(boolean debug, String url) { if (!TextUtils.isEmpty(url)) { baseUrl = url; } setOkhttp(debug); } /** * 初始化RxHttp * * @param debug false:非debug模式,true:debug模式 */ public static void init(boolean debug) { setOkhttp(debug); } private static void setOkhttp(boolean debug) { OkHttpClient.Builder builder = new OkHttpClient.Builder() .readTimeout(30 * 1000, TimeUnit.MILLISECONDS) .writeTimeout(30 * 1000, TimeUnit.MILLISECONDS) .connectTimeout(30 * 1000, TimeUnit.MILLISECONDS); /** * 注入请求日志 */ HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(loggingInterceptor); RxHttp.init(builder.build(), debug); } /** * get 请求 * * @param url 接口地址 * @param a * @param httpCallBack */ public void get(String url, FragmentActivity a, RxHttpCallBack httpCallBack) { RxHttp.get(url) .asString() .observeOn(AndroidSchedulers.mainThread()) .as(RxLife.asOnMain(a)) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { httpCallBack.onStart(); } @Override public void onNext(String s) { httpCallBack.onSuccess(s); } @Override public void onError(Throwable e) { httpCallBack.onError(e.getMessage()); } @Override public void onComplete() { httpCallBack.onFinish(); } }); } /** * get 请求 * * @param url 接口地址 * @param map 请求参数 * @param a * @param httpCallBack */ public void get(String url, Map<String, String> map, FragmentActivity a, RxHttpCallBack httpCallBack) { RxHttp.get(url) .addAll(map) .asString() .observeOn(AndroidSchedulers.mainThread()) .as(RxLife.asOnMain(a)) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { httpCallBack.onStart(); } @Override public void onNext(String s) { httpCallBack.onSuccess(s); } @Override public void onError(Throwable e) { httpCallBack.onError(e.getMessage()); } @Override public void onComplete() { httpCallBack.onFinish(); } }); } /** * get请求 * * @param url 接口地址 * @param map 请求参数 * @param rxBaseResponse 请求返回的数据对象 * @param a * @param httpResponse */ public void get(String url, Map<String, String> map, RxBaseResponse rxBaseResponse, FragmentActivity a, RxHttpResponse httpResponse) { RxHttp.get(url) .addAll(map) .asResponse(rxBaseResponse.getClass()) .observeOn(AndroidSchedulers.mainThread()) .as(RxLife.asOnMain(a)) .subscribe(new Observer<RxBaseResponse>() { @Override public void onSubscribe(Disposable d) { httpResponse.onStart(); } @Override public void onNext(RxBaseResponse rxBaseResponse) { httpResponse.onSuccess(rxBaseResponse); } @Override public void onError(Throwable e) { httpResponse.onError(e.getMessage()); } @Override public void onComplete() { httpResponse.onFinish(); } }); } /** * post请求 * * @param url 接口地址 * @param map 请求参数 * @param a * @param httpCallBack */ public void post(String url, Map<String, String> map, FragmentActivity a, RxHttpCallBack httpCallBack) { RxHttp.postForm(url) .addAll(map) .asString() .observeOn(AndroidSchedulers.mainThread()) .as(RxLife.asOnMain(a)) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { httpCallBack.onStart(); } @Override public void onNext(String s) { httpCallBack.onSuccess(s); } @Override public void onError(Throwable e) { httpCallBack.onError(e.getMessage()); } @Override public void onComplete() { httpCallBack.onFinish(); } }); } /** * post请求 * * @param url 接口地址 * @param map 请求参数 * @param baseResponse 请求返回的数据对象 * @param a * @param httpCallBack */ public void post(String url, Map<String, String> map, RxBaseResponse baseResponse, FragmentActivity a, RxHttpResponse httpCallBack) { RxHttp.postForm(url) .addAll(map) .asObject(baseResponse.getClass()) .observeOn(AndroidSchedulers.mainThread()) .as(RxLife.asOnMain(a)) .subscribe(new Observer<RxBaseResponse>() { @Override public void onSubscribe(Disposable d) { httpCallBack.onStart(); } @Override public void onNext(RxBaseResponse s) { httpCallBack.onSuccess(s); } @Override public void onError(Throwable e) { httpCallBack.onError(e.getMessage()); } @Override public void onComplete() { httpCallBack.onFinish(); } }); } /** * post表单请求 * * @param url 接口地址 * @param map 请求参数 * @param a * @param httpCallBack */ public void postFrom(String url, Map<String, String> map, FragmentActivity a, RxHttpCallBack httpCallBack) { RxHttp.postForm(url) .addAll(map) .asString() .observeOn(AndroidSchedulers.mainThread()) .as(RxLife.asOnMain(a)) //界面销毁,自动关闭请求 .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { httpCallBack.onStart(); } @Override public void onNext(String s) { httpCallBack.onSuccess(s); } @Override public void onError(Throwable e) { httpCallBack.onError(e.getMessage()); } @Override public void onComplete() { httpCallBack.onFinish(); } }); } /** * 上传文件 * * @param url 上传地址 * @param key 文件key * @param filePath 本地文件地址 * @param rxHttpFile 上传回调 */ public void uploadFile(String url, String key, String filePath, FragmentActivity a, RxHttpFile rxHttpFile) { RxHttp.postForm(url) //发送Form表单形式的Post请求 .addFile(key, new File(filePath)) .asUpload(new Consumer<Progress>() { @Override public void accept(Progress progress) throws Exception { rxHttpFile.onProgress(progress.getProgress(), progress.getCurrentSize(), progress.getTotalSize()); } }, AndroidSchedulers.mainThread()) .as(RxLife.asOnMain(a)) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { rxHttpFile.onStart(); } @Override public void onNext(String s) { rxHttpFile.onSuccess(s); } @Override public void onError(Throwable e) { rxHttpFile.onError(e.getMessage()); } @Override public void onComplete() { rxHttpFile.onFinish(); } }); } /** * 文件下载 * * @param httpUrl 下载的文件网络位置 * @param filePath 下载到本地的位置 * @param a activity * @param httpFile 下载回调 */ public void downloadFile(String httpUrl, String filePath, FragmentActivity a, RxHttpFile httpFile) { RxHttp.get(httpUrl) .asDownload(filePath, new Consumer<Progress>() { @Override public void accept(Progress progress) throws Exception { httpFile.onProgress(progress.getProgress(), progress.getCurrentSize(), progress.getTotalSize()); } }, AndroidSchedulers.mainThread()) //指定主线程回调 .as(RxLife.asOnMain(a)) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { httpFile.onStart(); } @Override public void onNext(String s) { httpFile.onSuccess(s); } @Override public void onError(Throwable e) { httpFile.onError(e.getMessage()); } @Override public void onComplete() { httpFile.onFinish(); } }); } /** * 链式请求实例,可根据实际需求做调整 * * @param a * @param url1 第一个接口地址 * @param url2 第二个接口地址 * @param map1 第一个接口请求的参数 * @param map2 第二个接口请求的参数 */ public void post(FragmentActivity a, String url1, String url2, Map<String, String> map1, Map<String, String> map2, RxHttpCallBack callBack) { RxHttp.postForm(url1) .addAll(map1) .asString() .flatMap(new Function<String, ObservableSource<?>>() { @Override public ObservableSource<?> apply(String s) throws Exception { return RxHttp.get(url2) .addAll(map2) .subscribeOnCurrent() .asString(); } }) .as(RxLife.asOnMain(a)) .subscribe(new Observer<Object>() { @Override public void onSubscribe(Disposable d) { callBack.onStart(); } @Override public void onNext(Object o) { callBack.onSuccess(o.toString()); } @Override public void onError(Throwable e) { callBack.onError(e.toString()); } @Override public void onComplete() { callBack.onFinish(); } }); } public interface RxHttpCallBack { /** * 开始请求 */ void onStart(); /** * 请求成功 * * @param response */ void onSuccess(String response); /** * 请求异常 * * @param error */ void onError(String error); /** * 请求结束 */ void onFinish(); } public interface RxHttpResponse { /** * 开始请求 */ void onStart(); /** * 请求成功 * * @param response */ void onSuccess(RxBaseResponse response); /** * 请求异常 * * @param error */ void onError(String error); /** * 请求结束 */ void onFinish(); } public interface RxHttpFile { /** * 开始请求 */ void onStart(); /** * 请求成功 * * @param response */ void onSuccess(String response); /** * 上传进度或下载进度 * * @param progress 当前进度 * @param currentSize 已上传或下载字节大小 * @param totalSize 总字节大小 */ void onProgress(int progress, long currentSize, long totalSize); /** * 请求异常 * * @param error */ void onError(String error); /** * 请求结束 */ void onFinish(); }}
如果需要请求结果返回对象可进行简单封装
public abstract class RxBaseResponse<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; }}
解析器
@Parser(name = "Response")public class RxResponseParser<T> extends AbstractParser<T> { protected RxResponseParser() { super(); } public RxResponseParser(Type type) { super(type); } @Override public T onParse(okhttp3.Response response) throws IOException { final Type type = ParameterizedTypeImpl.get(RxBaseResponse.class, mType); //获取泛型类型 RxBaseResponse<T> data = convert(response, type); T t = data.getData(); //获取data字段 if (data.getCode() != 200 || t == null) { //这里假设code不等于200,代表数据不正确,抛出异常 throw new ParseException(String.valueOf(data.getCode()), data.getMsg(), response); } return t; }}
致辞结束!
更多相关文章
- android网络通信
- “亲子安全卫士”项目总结
- 【Android】 使用okhttp实现注册登录功能(与服务器端)
- WebService接口调试如此简单
- Android(安卓)activity之间传递自定义类型数据【Serializable实
- 实现在Android简单封装类似JQuery异步请求
- 关于Android零基础学习的思考
- android service 本地 远程 总结
- (转)Android:Activity/Service/Broadcast Receiver/Content Prov