美文网首页
2022-01-25

2022-01-25

作者: Mr_step | 来源:发表于2022-01-26 10:14 被阅读0次

蛙笑网络请求优化方案

优化目的

解耦网络请求,解决嵌套地狱,减少内存泄漏

方案对比

  • 原始请求方式:
HttpMethods.getInstance().getJsonData(new NoProgressSubscriber(
        new SubscriberOnNextListener<RespListBean<GiftItemBean>>() {
            @Override
            public void onNext(RespListBean<GiftItemBean> o) {
                if (null != o) {
                    if (0 == o.status) {
                        if (null != o.table) {
                            if (null != o.table.row && o.table.row.size() > 0) {
                                giftItemBeanList = new ArrayList<GiftItemBean>();
                                for (int i = 0; i < o.table.row.size(); i++) {
                                    giftItemBeanList.add(o.table.row.get(i));
                                }
                                selectExchangeAdp.getDate(giftItemBeanList);
                            }
                        } else {
                            ToastUtils.getInstance().ShowToast(context, "没有查询到兑换商品");
                        }
                    } else {
                        ToastUtils.getInstance().ShowToast(context, o.msg);
                    }
                } else {
                    ToastUtils.getInstance().ShowToast(context, "无法连到服务器。");
                }
            }
        }, new TypeToken<RespListBean<GiftItemBean>>() {
}.getType()), getGiftByIntegralExchangeBean);
  • 改造完成的请求方式

    HttpUtils
            .createApi(waxiaoApi.class)
            .getBanner()
            .compose(Transformer.<BaseData<List<BannerBean>>>switchSchedulers(loading_dialog))
            .subscribe(new DataObserver<List<BannerBean>>() {
                
                @Override
                protected boolean isHideToast() {
                    return false;
                }
    
                //tag下的一组或一个请求,用来处理一个页面的所以请求或者某个请求
                //设置一个tag就行就可以取消当前页面所有请求或者某个请求了
                @Override
                protected String setTag() {
                    return "tag1";
                }
    
                @Override
                protected void onError(String errorMsg) {
    
                }
    
                @Override
                protected void onSuccess(RespListBean<GiftItemBean> o) {
                  if ( o.table.row.size() > 0) {
                                    giftItemBeanList = new ArrayList<GiftItemBean>();
                                    for (int i = 0; i < o.table.row.size(); i++) {
                                        giftItemBeanList.add(o.table.row.get(i));
                                    }
                                    selectExchangeAdp.getDate(giftItemBeanList);
                  }
                }
            });
    

方案优势:

  • 清晰的结构:

    createApi(WanAndroidApi.class)不同的模块使用不同的service

    设置tag 取消网络请求,减少崩溃和内存泄漏

    loading_dialog可以继承ILoadingView 接口化处理 让进度条不止能使用dialog

方案的改造成本

  • rxjava1.x->rxjava2.x,涉及到api 的更改
  • 整理之前的网络请求,换成新的方式

方案的改造细节

createApi

 public <A> A createApi(String baseUrlKey, String baseUrlValue, Class<A> apiClass) {
            Retrofit retrofit = new RetrofitBuilder()
                    .setBaseUrl(baseUrlValue)
                    .setCallAdapterFactory(callAdapterFactory)
                    .setConverterFactory(converterFactory)
                    .setOkHttpClient(okHttpClient)
                    .build();

            api = retrofit.create(apiClass);

            apiServiceCache.put(key, api);
        return api;
    }

DataObserver

public abstract class DataObserver<T> extends BaseObserver<RespListBean<T>> {

    /**
     * 失败回调
     *
     * @param errorMsg 错误信息
     */
    protected abstract void onError(String errorMsg);

    /**
     * 成功回调
     *
     * @param data 结果
     */
    protected abstract void onSuccess(T data);

    @Override
    public void doOnSubscribe(Disposable d) {
    }

    @Override
    public void doOnError(String errorMsg) {
        if (!isHideToast() && !TextUtils.isEmpty(errorMsg)) {
            ToastUtils.showToast(errorMsg);
        }
        onError(errorMsg);
    }

    @Override
    public void doOnNext(RespListBean<T> data) {
        //可以根据需求对code统一处理
//        switch (data.getCode()) {
//            case 0:
//                onSuccess(data.getData());
//                break;
//            case ..:
//                onError(data.getMsg());
//                break;
//           
//        }
        //统一做异常处理
            if(data==null){
                 onError(" 无法连到服务器.");
                 return;
            }
           onSuccess(data.getData());
    }

    @Override
    public void doOnCompleted() {
    }


}

BaseObserver

public abstract class BaseObserver<T> implements Observer<T>, ISubscriber<T> {

    /**
     * 是否隐藏toast
     *
     * @return
     */
    protected boolean isHideToast() {
        return false;
    }

    /**
     * 标记网络请求的tag
     * tag下的一组或一个请求,用来处理一个页面的所以请求或者某个请求
     * 设置一个tag就行就可以取消当前页面所有请求或者某个请求了
     * @return string
     */
    protected String setTag(){
        return null;
    }

    @Override
    public void onSubscribe(@NonNull Disposable d) {
        RxHttpManager.get().add(setTag(), d);
        doOnSubscribe(d);
    }

    @Override
    public void onNext(@NonNull T t) {
        doOnNext(t);
    }

    @Override
    public void onError(@NonNull Throwable e) {
        String error = ApiException.handleException(e).getMessage();
        setError(error);
    }


    @Override
    public void onComplete() {
        doOnCompleted();
    }


    private void setError(String errorMsg) {
        doOnError(errorMsg);
    }

}

Log细节优化:

public class RxHttpLogger implements HttpLoggingInterceptor.Logger {
    private StringBuffer mMessage = new StringBuffer();

    @Override
    public void log(String message) {
        // 请求或者响应开始
        if (message.startsWith("--> POST")) {
            mMessage.setLength(0);
            mMessage.append(" ");
            mMessage.append("\r\n");
        }
        if (message.startsWith("--> GET")) {
            mMessage.setLength(0);
            mMessage.append(" ");
            mMessage.append("\r\n");
        }
        // 以{}或者[]形式的说明是响应结果的json数据,需要进行格式化
        if ((message.startsWith("{") && message.endsWith("}"))
                || (message.startsWith("[") && message.endsWith("]"))) {
            message = JsonUtil.formatJson(message);
        }
        mMessage.append(message.concat("\n"));
        // 请求或者响应结束,打印整条日志
        if (message.startsWith("<-- END HTTP")) {
            Log.e("RxHttpUtils", mMessage.toString());
        }
    }
}

线程切换辅助

public class Transformer {

    /**
     * 无参数
     *
     * @param <T> 泛型
     * @return 返回Observable
     */
    public static <T> ObservableTransformer<T, T> switchSchedulers() {
        return switchSchedulers(null);
    }

    /**
     * 带参数  显示loading对话框
     *
     * @param loadingView loading
     * @param <T>         泛型
     * @return 返回Observable
     */
    public static <T> ObservableTransformer<T, T> switchSchedulers(final ILoadingView loadingView) {
        return new ObservableTransformer<T, T>() {
            @Override
            public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
                return upstream
                        .subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                        .doOnSubscribe(new Consumer<Disposable>() {
                            @Override
                            public void accept(@NonNull Disposable disposable) throws Exception {
                                if (loadingView != null) {
                                    loadingView.showLoadingView();
                                }
                            }
                        })
                        .subscribeOn(AndroidSchedulers.mainThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .doFinally(new Action() {
                            @Override
                            public void run() throws Exception {
                                if (loadingView != null) {
                                    loadingView.hideLoadingView();
                                }
                            }
                        });
            }
        };
    }

}

Api service 请求方式

 @POST("posapi/json")
    Observable<RespListBean<ListBean>> getItemData(ReqJsonBean bean)

拼装请求bean

val requestJsonBean  = ApiHelper.parseRequestBean(XXXRequestbean,funcName)

parseRequestBean核心代码

 Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .disableHtmlEscaping()
                .create();
        ReqJsonBean.RequestEntity requestEntity = new ReqJsonBean.RequestEntity();
        requestEntity.setRequest(xxxRequest);
        ReqJsonBean jsonBean = new ReqJsonBean();
        jsonBean.setRequestJson(gson.toJson(requestEntity).replaceAll("\\\\", ""));

相关文章

  • 橙子的ScalersTalk第六轮新概念朗读持续力训练Day 1

    练习材料:[Day 2679 2022-01-25] L4-(1): The double life of Alf...

  • Mac下安装dockr

    title: Mac下安装dockrdate: 2022-01-25 16:10author: 大雄 使用 hom...

  • Linux深入探索15-进程和作业控制

    ----- 最近更新【2022-01-25】----- 本文目录结构预览: 一、简介 二、内核管理进程的方式1、调...

  • 领书

    2022-01-25 读经人员:妈妈,小宝儿。 妈妈读经典内容:易经、孝经、笠翁对韵。 小宝读经内容:《伤寒论》《...

  • 《句句成章》69 Ge的情怀(一)

    原创 老区游子 游子岁月 2022-01-25 11:05 收录于话题 #情感故事 10个 句子:太多的老歌不敢听...

  • 2022-01-25

    《100天打卡》2022-01-25 小结:复盘重点,运动模块的思考。 疫情显见的逐渐消退,大概是前天狂侃情怀的...

  • 2022-01-25

    【2022-01-13~2022-01-25】 1912-2022 110年间,中国及其朝鲜半岛一共经历过几个历史...

  • 2022-01-25 价值投资分享 1 - 坏支出

    2022-01-25 周二 1. 如何减少坏支出? 每个月的消费做个规划:分清必要消费、不必要消费。做好预算,买...

  • 杀死一只知更鸟中的hickory nuts是什么?

    2022-01-25在阿拉巴马州T城市捡拾过我们称作的碧根果(pecan nuts,当时已发现至少3个品种),所以...

  • 2022-01-25

    别想太多,用心做好身边事 生活中,大多数人的问题就是想得太多,反而伤了自己。别人随便一句话,你却耿耿于怀。也许别人...

网友评论

      本文标题:2022-01-25

      本文链接:https://www.haomeiwen.com/subject/dugwhrtx.html