美文网首页
基于项目中Okhttp网络框架使用方式的改进

基于项目中Okhttp网络框架使用方式的改进

作者: 杨hai | 来源:发表于2017-04-16 11:51 被阅读77次
为什么改进
  1. 简化代码的开发和方便业务逻辑的梳理(阐述项目中现在代码的使用情况)
    在项目中,请求网络的回调有多个方法需要处理,而在项目中,有些回调方法在有些情况下是不需要处理的,接口分离原则,不同的情况通过不同的接口实现,这样也方便使用lambda表达式简写。
    下面两块代码是项目中的使用的情况
//这里的callback作用是用来处理请求网络完成后的回调实例。
OkHttpUtils.ResultCallback<String> callback = new OkHttpUtils.ResultCallback<String>() {
            @Override
            public void onSuccess(String response) {
             // TODO  转换成需要的对象,每一次请求回来的数据都要这样转换一次,才能拿到需要的对象。在这次的改造中,就是把这个工作交给网络请求的工具内部自动完成。
                GetAdvListBean getAdvListBean = getGson().fromJson(response, GetAdvListBean.class);
                if (200 == getAdvListBean.getResult()) {
                 //TODO 成功的时候,需要做的处理
                }
                pullToRefreshView.refreshComplete();
            }

            @Override
            public void onFailure(Request request, Exception e) {
            // TODO 服务器失败的时候,需要做的处理
            }
        };

需要处理多个处理多个结果的情况:


    private void requestAccountInfo() {
    //这是一个请求网络的回调实例。
        OkHttpUtils.ResultCallback<String> callback = new OkHttpUtils.ResultCallback<String>() {

            @Override
            public void onSuccess(String response) {
              //转换成对应的对象,每次都要转换的;
                accountInfo = getGson().fromJson(response, GetMyAccountInfoBean.class);
                if (200 == accountInfo.getResult()) {
                  //服务器返回的code等于200 的时候需要做的处理
                   
                } else if (300 == accountInfo.getResult()) {
                // 服务器返回code为300时,需要做的处理。
                } else if (400 == accountInfo.getResult()) {
                //服务器返回的Code等于400的时候,要做的处理。
                    }
                }
            }

            @Override
            public void onFailure(Request request, Exception e) {
              // 请求网络失败的回到方法
            }
        };
    }

小结:在上面的代码中,我们有些地方需要处理200,300,400,等多种的情况;那么在需要用到的地方,都需要些上面的代码进行判断。

改进的目标

我需要处理200的情况,我就传ISuccess接口,如果需要处理网络异常,我就传递INetWork接口,我不需要处理的情况我就不传递对应的参数。

 OkHttpUtils.post(Constants.userSign, paramsList, new ISuccess<UserSignBean>() {
            @Override
            public void success(UserSignBean response) {
              //只需要处理code等于200的情况
            }
        });

需要处理多个情况:

 
        OkHttpUtils.post(Constants.getNoticeList, params, new ISuccess<NoticeResponse>() {
            @Override
            public void success(NoticeResponse response) {
                //处理成功的情况
        }, (msg) -> {
              // 处理服务器数据状态非200的情况
            pullToRefreshView.refreshComplete();
        }, () -> {
              // 处理网络请求失败的情况
            pullToRefreshView.refreshComplete();
        });

使用到的技术:

  1. 使用lambda表达式简化代码(lambda表达式是什么?)
    接口中只有一个方法时,可以使用lambad表达式简写。
  2. 什么是泛型:是一个约束类型安全的语法糖。(只在编译时)
  3. 什么是Gson:是一个将符合Json格式的String 字符串转换成javaBean对象。
class Person {
public String name;
public String age;
}
Person person  = new Gson().fromJson(str, Person.class);

小结:在这个功能的改进中,我做的主要工作是熟悉这三个工具的特点,对他们进
行了一次整合。达到了简化代码的目的。(在这里利用了他们什么特点进行阐述)

实现步骤
  1. 通过传递的成功接口中,获取传递的泛型类型;
  2. 然后更具泛型类型进行比较,
  3. 如果是String类型,那么直接将结果作为参数传递回去
  4. 如果是非String 类型,那么将返回的String 字符串转换成对应的Bean对象。然后作为方法参数传递回去。
private void delivery(Request request, final ISuccess listener0, final IService listener1, final INetWork listener2) {

        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                noNetwork(listener2);
            }

            @Override
            public void onResponse(Response response) throws IOException {
                try {
                    Type[] types = listener0.getClass().getGenericInterfaces();
                    ParameterizedType parameterized = (ParameterizedType) types[0];
                    Class<T> clazz = (Class<T>) parameterized.getActualTypeArguments()[0];
                    String str = response.body().string();
                    //传递的泛型是String的时候,直接将数据丢出去
                    if (clazz == String.class) {
                        T t = (T) str;
                        onSuccess(listener0, t);
                    } else {
                        T t = getGson().fromJson(str, clazz);
                        if (t == null) {
                            onServiceError(listener1, "服务器错误");
                        } else {
                            // 如果返回的数据解析成功,那么判断返回的code
                            BaseEntity br = (BaseEntity) t;
                            if (br.getResult() != 200) {
                                // 返回code不是200的时候,调用如下方法
                                onServiceError(listener1, br.getResultMsg());
                            } else {
                              //200的时候做如下处理
                                onSuccess(listener0, t);
                            }
                        }
                    }
                } catch (Exception e) {
                    noNetwork(listener2);
                }
            }
        });
    }
实现的结果
/**
     * 验证登录状态
     *
     * @param token
     */
    private void checkToken(String token) {
        List<Param> paramsList = new ArrayList<>();
        Param tokenValue = new Param("token", token);
        paramsList.add(tokenValue);
        OkHttpUtils.post(Constants.checkToken, paramsList, new ISuccess<BaseEntity>() {
                    @Override
                    public void success(BaseEntity response) {
                  //处理成功的请求
                }, (String errMsg) -> {
                // 处理服务器code不等于200的情况
                    LoginUtils.toLogin(mActivity);
                }
        );
    }
//注:在这里,不需要处理网络情况失败的情况,所以不需要实现第三个回调方法
遇到的问题
  1. 想要得到的效果:
(msg) -> {
            pullToRefreshView.refreshComplete();
        }
  1. 实际得到的效果:
 new ISuccess<NoticeResponse>() {
            @Override
            public void success(NoticeResponse response) {
                // 处理服务器数据成功的情况
                }
        }
//注:在这里,想要达到上面的效果,但是如果写成上面的效果,那么就不能传递 
 泛型进去,不传递泛型进去,在转换的地方就不能正常的执行;这个冲突暂时不知道怎么解决。

相关文章

  • 基于项目中Okhttp网络框架使用方式的改进

    为什么改进 简化代码的开发和方便业务逻辑的梳理(阐述项目中现在代码的使用情况)在项目中,请求网络的回调有多个方法需...

  • 「开源框架」Retrofit

    网络请求框架:Volley、OkHttp3、Retrofit,项目中使用 OkHttp3 较多。目前主流框架为Re...

  • retrofit原理 Glide

    retrofit是基于okhttp封装的网络框架,主要通过注解的方式进行网络请求,retrofit.create(...

  • Okhttp使用总结

    在项目中用的是Okhttp 3.4.2,替换原有的网络框架,okhttp使用很方便,封装性很好,在此纪录一下使用过...

  • OkOne-基于okhttp的网络性能优化框架

    简介 OkOne是一款基于okhttp库的网络性能优化框架,但不同于其他框架对okhttp的使用调用进行封装,而是...

  • OkHttp3原理浅析<一>

    OkHttp是现在Android使用最频繁的网络请求框架.Retrofit也是使用OKHttp的网络框架。现在来看...

  • Android OKHttp的基本使用

    一、 Android中网络请求是必不可少的。OkHttp是网络框架界的大佬了,很多网络框架都基于OkHttp封装。...

  • 1、Retrofit

    1、Retrofit与其他网络请求框架的区别? 功能、性能、使用场景 优点:Retrofit基于OkHttp、通过...

  • 6.1开源框架-okhttp网络框架-详解

    okhttp网络框架 OkHttp使用简介 OkHttp源码剖析 1.OkHttp使用简介 创建客户端Okhttp...

  • 基于EventBus和OkHttp搭建的网络框架

    基于EventBus和OkHttp搭建的网络框架 简介 本编文章是基于EventBus3.0和OkHttp搭建的网...

网友评论

      本文标题:基于项目中Okhttp网络框架使用方式的改进

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