Android仿人人客户端(v5.7.1)——网络模块优化
2013-03-30 17:52
453 查看
转载请标明出处:/article/7739543.html
声明:仿人人项目,所用所有图片资源都来源于官方人人android客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。
上一篇聊到网络模块的架构,我后来思考了下,觉得有可以优化的地方。
一、先提出我后来思考的问题:
在AppBaseActivity(对Activity类的扩展)中,用变量mAsyncRequests存储当前activity所持有的所有网络请求,仔细阅读过上一篇博文源码的朋友,一定知道有两处中断当前Activity所持有的网络异步处理,分别是在activity暂停(回调方法onPause())和销毁(回调方法onDestroy())的时候。上一篇的处理方式,代码片段如下:
仔细阅读上面的代码片段,会发现只是断开了网络请求返回,之后就从当前Activity所持有的网络请求集合中移除了AsyncBaseRequest对象,经过实践就会发现,这种处理方式明显存在问题。中断网络异步请求时,会有以下几种场景:
1、在异步线程中,当前正在发生着通过HTTP协议获取服务器端返回的数据(InputStream),恰巧在这个时候调用请求中断异步处理,上一篇的处理方式能处理。
2、在异步线程中,当前正发生着网络请求的数据已返回,这时调用中断处理,也就是说后面的数据解析和刷新UI的事就不处理了,上一篇的处理方式不能满足需求。
3、在异步线程中,当前正发生着网络请求返回的数据已解析完,这时调用中断处理,也就是说后面让主线程刷新UI的事就不处理了,上一篇的处理方式不能满足需求。
4、在异步线程中,当前正在发生着。。。,这时调用中断处理,后面的。。。就不用处理了。(可以控制颗粒度精细点,呵呵)
二、对上面提出的问题,我的解决方案只考虑三种情况,在Activity中调用中断处理时,异步线程中的预处理方式。
1、在异步线程类(AsyncBaseRequest)中添加中断标识,代码如下:
2、在异步线程类(AsyncBaseRequest)中的核心方法中添加预处理,代码如下:
3、在Activity(AppBaseActivity)中的处理,代码如下:
以上就是对上一篇网络处理模块中存在的问题,我的解决方式。大家有什么更好的方式,可以交流下。互相借鉴,共同进步!
声明:仿人人项目,所用所有图片资源都来源于官方人人android客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。
上一篇聊到网络模块的架构,我后来思考了下,觉得有可以优化的地方。
一、先提出我后来思考的问题:
在AppBaseActivity(对Activity类的扩展)中,用变量mAsyncRequests存储当前activity所持有的所有网络请求,仔细阅读过上一篇博文源码的朋友,一定知道有两处中断当前Activity所持有的网络异步处理,分别是在activity暂停(回调方法onPause())和销毁(回调方法onDestroy())的时候。上一篇的处理方式,代码片段如下:
private void cancelRequest() { if (mAsyncRequests != null && mAsyncRequests.size() > 0) { for (AsyncBaseRequest request : mAsyncRequests) { HttpURLConnection conn = request.getRequestConn(); if ( conn != null) { try { conn.disconnect(); System.out.println("onDestroy disconnect URL: " + conn.getURL()); mAsyncRequests.remove(request); } catch (UnsupportedOperationException e) { //do nothing . } } } } }
仔细阅读上面的代码片段,会发现只是断开了网络请求返回,之后就从当前Activity所持有的网络请求集合中移除了AsyncBaseRequest对象,经过实践就会发现,这种处理方式明显存在问题。中断网络异步请求时,会有以下几种场景:
1、在异步线程中,当前正在发生着通过HTTP协议获取服务器端返回的数据(InputStream),恰巧在这个时候调用请求中断异步处理,上一篇的处理方式能处理。
2、在异步线程中,当前正发生着网络请求的数据已返回,这时调用中断处理,也就是说后面的数据解析和刷新UI的事就不处理了,上一篇的处理方式不能满足需求。
3、在异步线程中,当前正发生着网络请求返回的数据已解析完,这时调用中断处理,也就是说后面让主线程刷新UI的事就不处理了,上一篇的处理方式不能满足需求。
4、在异步线程中,当前正在发生着。。。,这时调用中断处理,后面的。。。就不用处理了。(可以控制颗粒度精细点,呵呵)
二、对上面提出的问题,我的解决方案只考虑三种情况,在Activity中调用中断处理时,异步线程中的预处理方式。
1、在异步线程类(AsyncBaseRequest)中添加中断标识,代码如下:
private boolean interrupted; public boolean isInterrupted() { return interrupted; } public void setInterrupted(boolean interrupted) { this.interrupted = interrupted; }
2、在异步线程类(AsyncBaseRequest)中的核心方法中添加预处理,代码如下:
@Override public void run() { try { if (interrupted) { System.err.println("访问网络前中断业务处理线程(终止)"); return; } mInStream = getRequestResult(); if (mInStream != null) { if (interrupted) { System.err.println("解析数据前中断业务处理线程(终止)"); return; } String result = new String(readInputStream(mInStream)); Object obj = parseHandler.parse(result); if (interrupted) { System.err.println("刷新UI前中断业务处理线程(终止)"); return; } requestCallback.onSuccess(obj); } else { System.out.println("get InputStream By HttpURLConnection return result is NULL."); requestCallback.onFail(Constant.NETWORK_REQUEST_RETUN_NULL); // 网络请求返回NULL } } catch (IOException e) { requestCallback.onFail(Constant.NETWORK_REQUEST_IOEXCEPTION_CODE); // IO异常标识 e.printStackTrace(); } catch (JSONException e) { requestCallback.onFail(Constant.NETWORK_REQUEST_RESULT_PARSE_ERROR); // 网络请求返回结果解析出错 e.printStackTrace(); } }
3、在Activity(AppBaseActivity)中的处理,代码如下:
@Override protected void onPause() { /** * 在activity暂停的时候,同时设置终止标识,终止异步线程 */ cancelAllRequest(); super.onPause(); } private void cancelAllRequest() { if (mAsyncRequests != null && mAsyncRequests.size() > 0) { try { for (AsyncBaseRequest request : mAsyncRequests) { Thread thread = new Thread(request); if (thread.isAlive() || !Thread.interrupted()) { request.setInterrupted(true); } HttpURLConnection conn = request.getRequestConn(); if (conn != null) { // conn.disconnect(); System.err.println("onDestroy disconnect URL: " + conn.getURL()); } mAsyncRequests.remove(request); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override protected void onDestroy() { /** * 在activity销毁的时候,同时设置终止标识,终止异步线程 */ cancelAllRequest(); super.onDestroy(); }
以上就是对上一篇网络处理模块中存在的问题,我的解决方式。大家有什么更好的方式,可以交流下。互相借鉴,共同进步!
相关文章推荐
- Android仿人人客户端(v5.7.1)——网络模块时序图
- Android仿人人客户端(v5.7.1)——网络模块处理的架构
- Android仿人人客户端(v5.7.1)——网络模块处理的架构
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(流程图或活动图)
- 图片、缓存-Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)-by小雨
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- Android仿人人客户端(v5.7.1)——采用RelativeLayout做父容器,实现左侧滑动菜单(一)
- Android仿人人客户端(v5.7.1)——授权认证(用accessToken换取session_key、session_secret和userId)
- Android仿人人客户端(v5.7.1)——采用RelativeLayout做父容器,实现左侧滑动菜单(一)
- Android仿人人客户端(v5.7.1)——个人主页(一)
- Android仿人人客户端(v5.7.1)——新鲜事之状态
- Android仿人人客户端(v5.7.1)——新鲜事之分享照片
- Android仿人人客户端(v5.7.1)——有关滑动式左侧菜单实现过程中网友的疑问解答
- Android仿人人客户端(v5.7.1)——采用RelativeLayout做父容器,实现左侧滑动菜单(一)
- Android仿人人客户端(v5.7.1)——欢迎和导引界面的编码实现
- Android仿人人客户端(v5.7.1)——项目框架新做的调整描述(项目中基类java源码)
- Android仿人人客户端(v5.7.1)——应用主界面之左侧面板UI实现
- Android仿人人客户端(v5.7.1)——主流程(活动)图