Android App 中简易的网络数据处理方法
2016-05-04 18:17
489 查看
前言:由于工作需要,前段时间都在忙着写 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 中发出了网络请求
ConvertCenter 会这样处理数据
然后在 MainTab1 的 Handler 中这样处理
这样所有的数据就对应起来了,当然在 ConvertRetKey 这个类中,定义字符串常量的时候,要见名知义、知来源,最好加些注释说明清楚。此外,项目中的 OkHttpClientManager
类对 okhttp 进行了简单的封装,还用到了 Gson,还有之前集成第三方登录和分享时导入的一些包和测试代码,这些都不在本章讨论的范围之内,请忽略。项目中的测试地址,是我在局域网上搭的一个服务器地址,如果你下载了源码进行测试,要把地址换掉哦。如有遗漏或写得不好的地方,欢迎大家指导。
点击这里下载源码!
在做电商应用的时候,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,还有之前集成第三方登录和分享时导入的一些包和测试代码,这些都不在本章讨论的范围之内,请忽略。项目中的测试地址,是我在局域网上搭的一个服务器地址,如果你下载了源码进行测试,要把地址换掉哦。如有遗漏或写得不好的地方,欢迎大家指导。
点击这里下载源码!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件