使用方法(很简单有木有)
showLoading(); Map<String, String> map = new ArrayMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); addDispose(RxNet.request(ApiManager.getInstance().getCat(map), new RxNetCallBack<List<CatBean>>() { @Override public void onSuccess(List<CatBean> data) { hideLoading(); showToast("获取信息成功" + data.get(0).toString()); } @Override public void onFailure(String msg) { hideLoading(); showToast(msg); } }));
它是怎么实现的呢?
(一)RxNet(有三种请求方式,很据需求可增加比如上传、下载):
1:返回数据带有body
{code:"200", msg:"请求成功", pwd:"*******"}
2:返回数据没有body
{code:"200", msg:"请求成功"}
3:请求返回错误请求码(-1表示请求失败)
{code:"201", msg:"修改失败"}
核心代码如下:
/** * 一般请求,返回数据带有body */ public static <T> Disposable request(Observable<BaseResponse<T>> observable, final RxNetCallBack<T> callBack) { return observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(new Function<Throwable, BaseResponse<T>>() { @Override public BaseResponse<T> apply(Throwable throwable) { callBack.onFailure(ExceptionHandle.handleException(throwable)); return null; } }) .subscribe(new Consumer<BaseResponse<T>>() { @Override public void accept(BaseResponse<T> tBaseResponse) { if (tBaseResponse.getCode().equals("200")) { callBack.onSuccess(tBaseResponse.getData()); } else { callBack.onFailure(tBaseResponse.getMsg()); } } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) { AppLogUtil.printE("请求错误:" + throwable.getMessage()); } }); } /** * 返回数据没有body */ public static Disposable requestWithoutBody(Observable<BaseResponse> observable, final RxNetCallBack<String> callBack) { return observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(new Function<Throwable, BaseResponse>() { @Override public BaseResponse apply(Throwable throwable) { callBack.onFailure(ExceptionHandle.handleException(throwable)); return null; } }) .subscribe(new Consumer<BaseResponse>() { @Override public void accept(BaseResponse baseResponse) { if (baseResponse.getCode().equals("200")) { callBack.onSuccess(baseResponse.getMsg()); } else { callBack.onFailure(baseResponse.getMsg()); } } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) { AppLogUtil.printE("请求错误:" + throwable.getMessage()); } }); } /** * 请求返回错误请求码 * -1表示请求失败 */ public static <T> Disposable requestForCode(Observable<BaseResponse<T>> observable, final RxNetCallBackForCode<T> callBack) { return observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(new Function<Throwable, BaseResponse<T>>() { @Override public BaseResponse<T> apply(Throwable throwable) { // -1表示请求失败 callBack.onFailure("-1", ExceptionHandle.handleException(throwable)); return null; } }) .subscribe(new Consumer<BaseResponse<T>>() { @Override public void accept(BaseResponse<T> tBaseResponse) { if (tBaseResponse.getCode().equals("200")) { callBack.onSuccess(tBaseResponse.getData()); } else { callBack.onFailure(tBaseResponse.getCode(), tBaseResponse.getMsg()); } } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) { AppLogUtil.printE("请求错误:" + throwable.getMessage()); } }); } /** * 下载和上传 */
(二)实现Retrofit2的全局请求单例
public class ApiManager { private Retrofit client; private ApiManager() { client = new Retrofit.Builder() .baseUrl(AppConstants.Base_Url_Test) .client(initClient()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); } private static volatile AppApi INSTANCE; public static AppApi getInstance() { if (INSTANCE == null) { synchronized (ApiManager.class) { if (INSTANCE == null) { INSTANCE = new ApiManager().getAppApi(); } } } return INSTANCE; } private AppApi getAppApi() { return client.create(AppApi.class); } private static OkHttpClient initClient() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); //声明日志类 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { AppLogUtil.printE(message); } }); //设定日志级别 httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //延时 builder.addInterceptor(httpLoggingInterceptor) //设置参数加密 //.addInterceptor(new EncryptParamInterceptor()) .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS); return builder.build(); } }
ps:参数加密的步骤:拦截带有请求参数的请求,对参数进行加密后 ,重新组装成请求体,再进行请求,
核心代码如下:
** * 加密请求参数 */public class EncryptParamInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Map<String, String> mapForJson = new ArrayMap<>(); if (request.method().equals("GET")) { for (int i = 0; i < request.url().querySize(); i++) { mapForJson.put(request.url().queryParameterName(i), request.url().queryParameterValue(i)); } } else if (request.method().equals("POST") && (request.body() instanceof FormBody)) { FormBody oldFormBody = (FormBody) request.body(); for (int i = 0; i < oldFormBody.size(); i++) { mapForJson.put(oldFormBody.name(i), oldFormBody.value(i)); } } Gson gson = new Gson(); String json = gson.toJson(mapForJson); String pwdText = null; try { //这里是你自己的加密方式(和后台人员商定) // pwdText = AESUtil.encrypt(json); pwdText = "****************"; } catch (Exception e) { e.printStackTrace(); } //防止服务器"+"被编码成空格 if (!TextUtils.isEmpty(pwdText)) { pwdText = pwdText.replace("+", "%2B"); } FormBody.Builder bodyBuilder = new FormBody.Builder(); FormBody formBody; formBody = bodyBuilder .addEncoded("param", handlePwdTextXx(pwdText)) .build(); Request newRequest = request.newBuilder() .post(formBody) .build(); return chain.proceed(newRequest); } /** * 处理密文中的0x 0X * 防止解密失败 */ private static String handlePwdTextXx(String pwdText) { if (TextUtils.isEmpty(pwdText)){ return ""; } if (pwdText.contains("0x")) { pwdText = pwdText.replace("0x", "0x"); } if (pwdText.contains("0X")) { pwdText = pwdText.replace("0X", "0X"); } return pwdText; } }
(三)addDispose()方法
先看代码:
@SuppressLint("Registered")public class BaseActivity extends AppCompatActivity implements BaseView { //........................ //添加当前类名(lin.frameapp.xxx)的dispose public void addDispose(Disposable disposable) { RxDisposeManager.get().add(getClass().getName(), disposable); } @Override protected void onDestroy() { super.onDestroy(); //移除dispose RxDisposeManager.get().cancel(getClass().getName()); } //........................}
用RxDisposeManager去管理每个请求的disposable,在适当的时候去dispose,防止内存泄露
RxDisposeManager也是用单例实现:
public class RxDisposeManager { private static volatile RxDisposeManager sInstance = null; private ArrayMap<Object, Disposable> maps; public static RxDisposeManager get() { if (sInstance == null) { synchronized (RxDisposeManager.class) { if (sInstance == null) { sInstance = new RxDisposeManager(); } } } return sInstance; } private RxDisposeManager() { maps = new ArrayMap<>(); } public void add(Object tag, Disposable disposable) { maps.put(tag, disposable); } public void remove(Object tag) { if (!maps.isEmpty()) { maps.remove(tag); } } public void removeAll() { if (!maps.isEmpty()) { maps.clear(); } } public void cancel(Object tag) { if (maps.isEmpty()) { return; } if (maps.get(tag) == null) { return; } if (!maps.get(tag).isDisposed()) { maps.get(tag).dispose(); maps.remove(tag); } } public void cancelAll() { if (maps.isEmpty()) { return; } Set<Object> keys = maps.keySet(); for (Object apiKey : keys) { cancel(apiKey); } } }
作者:林祖朋
链接:https://www.jianshu.com/p/4e87e7fd4f0c
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦