前言:由于工作需要,前段时间都在忙着写 php,这段时间又来写 Android 了,我就是这么个兴趣广泛不安分的人,哈哈。 在做电商应用的时候,App 通常要发送大量的网络请求,服务器返回数据通常都是 Json 或字符串格式的。新手在做开发的时候,习惯于在 activity 或 fragment 里面直接处理与它相关的网络请求(发送请求、处理服务器返回的数据),这样会导致一些 activity 和 fragment 代码臃肿杂乱,因为这时的 activity 即是 view 又是 controller 又是 model,显然这样不利于维护。当然很多人都有自己的解决方法,现在最火热的就是 mvp 模式了,网上有一大堆介绍它的文章,所以我就不重复了。这里我说下我的想法,欢迎各位大神指教。 下面这张图是我处理网络请求的一个简易流程: (1). 当 View 需要发出网络请求的时候,它要创建一个 ParamPacket 对象,把请求地址、参数、所在 view 的 handler 对象引用等信息都设置到这个对象里面,然后 调用 RequestPoster 的 postNetRequest() 方法,并把这个参数传递过去; (2). 然后 RequestPoster 从它接收到的 ParamPacket 对象中取出相关参数,向服务器发送请求; (3). 服务器返回 App 需要的数据包 data1; (4). 把服务器返回的数据包 data1 发送给 ConvertCenter 进行处理; (5). ConvertCenter 返回处理好后的数据 data2 给 RequestPoster;

(6). RequestPoster 根据 ParamPacket 对象中的 handler ,调用 handler.sendMessage(data2) 把 data2 返回给 View 。


要注意的一些问题是: (1)在创建 ParamPacket 对象的时候,一定要把创建它的 View 中的 Handler 的引用设置进去,目的是在 RequestPoster 在处理完成后,可以通过个 Handler 对象把处理好的数据返回给相应 View; (2)在 ConvertCenter 进行处理后,得到的结果类型是多种多样的,可能是 ArrayList、String、Map 等等,但是方法的返回类型只能是单一的。所以我在 ConvertCenter 的 convertData() 方法中,使用 HashMap 存储返回结果,然后返回这个 HashMap 对象。但是问题来了,View 是不知道这个 HashMap 对象里面存储的是什么东西的?为了解决这个问题,我多加了一个 ConvertRetKey 类,这个类里面只是存放了一些字符串常量。HashMap 在进行 put() 操作的时候,其 key 就来自这个 ConvertRetKey,View 在从 HashMap 对象中 get() 对象的时候,其 key 也是来自这个 ConvertRetKey,这样就可以通过字符串常量名来把两者对应起来。如 MainTab1 这个 fragment 中发出了网络请求
Button button2 = (Button)getActivity().findViewById(R.id.activity_main_tab1_btn_testnet);button2.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View view) {        OkHttpClientManager.Param[] paramArray = new OkHttpClientManager.Param[]{            new OkHttpClientManager.Param("lat", ""),            new OkHttpClientManager.Param("lng", "")        };        ParamPacket paramPacket = new ParamPacket(UrlList.MAINTAB1_TEST_URL, paramArray, mHandler, HandlerMsgType.MAINTAB1_NET_TEST);        RequestPoster.postNetRequest(paramPacket);    }});

ConvertCenter 会这样处理数据
public static HashMap<String, Object> convertData(int messageType, String dataString) {    switch (messageType) {        case HandlerMsgType.MAINTAB1_NET_TEST:            return MAINTAB1_NET_TEST(dataString);    }    return null;}public static HashMap<String, Object> MAINTAB1_NET_TEST(String dataString) {    HashMap<String, Object> retMap = new HashMap();    retMap.put(ConvertRetKey.MAINTAB1_NET_TEST, dataString);    return retMap;}

然后在 MainTab1 的 Handler 中这样处理
private void initHandler() {    mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            switch (msg.what) {                case HandlerMsgType.MAINTAB1_NET_TEST : {                    Map<String , Object>  ret = (Map<String , Object>)msg.obj;                    String retString = (String) ret.get(ConvertRetKey.MAINTAB1_NET_TEST);                    mTestTv.setText(retString);                    break;                }            }            return false;        }    });}
这样所有的数据就对应起来了,当然在ConvertRetKey 这个类中,定义字符串常量的时候,要见名知义、知来源,最好加些注释说明清楚。此外,项目中的 OkHttpClientManager 类对 okhttp 进行了简单的封装,还用到了 Gson,还有之前集成第三方登录和分享时导入的一些包和测试代码,这些都不在本章讨论的范围之内,请忽略。项目中的测试地址,是我在局域网上搭的一个服务器地址,如果你下载了源码进行测试,要把地址换掉哦。如有遗漏或写得不好的地方,欢迎大家指导。
点击这里下载源码!




更多相关文章

  1. 万字长文带你了解最常用的开源 Squid 代理服务器
  2. Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
  3. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  4. Android基于HTTP网络编程总结浅析
  5. Android性能优化篇:从布局角度进行优化
  6. Android@Kotlin 在Android(安卓)studio 中配置Kotlin
  7. 面试技术汇总
  8. [置顶] Android上传文件到Web服务器,PHP接收文件(一)
  9. Android集成微信支付功能

随机推荐

  1. [随时更新] Android小问题记录
  2. Android技术分享
  3. 【Android测试】Android抓包解析全过程
  4. Android(安卓)Protect-0.签名相关
  5. Android抓包工具使用与错误
  6. Android(安卓)7.1 bootchart触发后导致不
  7. Android(安卓)MVP 详解(下)
  8. Android,一个函数实现计步器(软计步,硬计
  9. WindowManger与window之基础篇
  10. Android仿饿了么搜索功能