您的位置:首页 > 理论基础 > 计算机网络

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 中发出了网络请求
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,还有之前集成第三方登录和分享时导入的一些包和测试代码,这些都不在本章讨论的范围之内,请忽略。项目中的测试地址,是我在局域网上搭的一个服务器地址,如果你下载了源码进行测试,要把地址换掉哦。如有遗漏或写得不好的地方,欢迎大家指导。

    点击这里下载源码!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息