Android仿人人客户端(v5.7.1)——网络模块处理的架构

分类:仿人人Android客户端(v5.7.1) 7407人阅读 评论(27) 收藏 举报 网络处理 ANDROID 仿人人 网络模块架构 类图

转载请标明出处:http://blog.csdn.net/android_ls/article/details/8732427
声明:仿人人项目,所用所有图片资源都来源于官方人人android客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。
上一篇聊到了通过WebView组件加载人人的访问授权页面,接下来就是当用户输入人人访问账号和密码,点击“登录”按钮,成功后人人的服务器端会返回AccessToken的值。初次使用,我们本地是没有存储session Key的,我们需要通过AccessToken去服务器端请求数据,获得session Key、sessionSecret和用户的userId。存储当前获得的sessionKey, sessionSecret以备后用。这里就需要用到网络这块的知识,这一篇就来说下仿人人的网络模块是如何架构的,先来看下网络处理模块的类图:

一、网络请求基类(AsyncBaseRequest),是一个实现Runnable接口的线程类。

初始化时的参数列表:

[java] view plain copy
  1. publicAsyncBaseRequest(Stringurl,Map<String,String>parameter,ParseCallbackhandler,ResultCallbackrequestCallback){}

参数列表解释:

第一个参数:网络请求URL;

第二个参数:网络请求的参数;

第三个参数:网络请求返回数据的解析器;

第四个参数:网络请求返回的结果回调接口;
网络请求具体实现抽象方法:

[java] view plain copy
  1. protectedabstractInputStreamgetRequestResult()throwsIOException;

线程核心run()方法里面的实现:

[java] view plain copy
  1. @Override
  2. publicvoidrun(){
  3. try{
  4. mInStream=getRequestResult();
  5. if(mInStream!=null){
  6. Stringresult=newString(readInputStream(mInStream));
  7. Objectobj=parseHandler.parse(result);
  8. requestCallback.onSuccess(flag,obj);
  9. }else{
  10. System.out.println("getInputStreamByHttpURLConnectionreturnresultisNULL.");
  11. }
  12. }catch(IOExceptione){
  13. requestCallback.onFail(flag,Constant.NETWORK_REQUEST_IOEXCEPTION_CODE);//IO异常标识
  14. e.printStackTrace();
  15. }
  16. }

二、通过HTTP协议发送GET请求的具体实现

[java] view plain copy
  1. packagecom.everyone.android.net;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importjava.net.HttpURLConnection;
  5. importjava.net.URL;
  6. importjava.net.URLEncoder;
  7. importjava.util.Map;
  8. importorg.apache.http.protocol.HTTP;
  9. importcom.everyone.android.callback.ParseCallback;
  10. importcom.everyone.android.callback.ResultCallback;
  11. /**
  12. *功能描述:通过HTTP协议发送GET请求
  13. *@authorandroid_ls
  14. *
  15. */
  16. publicclassAsyncHttpGetextendsAsyncBaseRequest{
  17. /**
  18. *
  19. */
  20. privatestaticfinallongserialVersionUID=2L;
  21. publicAsyncHttpGet(Stringurl,Map<String,String>parameter,
  22. ParseCallbackhandler,ResultCallbackrequestCallback)throwsIOException{
  23. super(url,parameter,handler,requestCallback);
  24. }
  25. @Override
  26. protectedInputStreamgetRequestResult()throwsIOException{
  27. StringBuildersb=newStringBuilder(requestUrl);
  28. sb.append('?');
  29. for(Map.Entry<String,String>entry:parameter.entrySet()){
  30. sb.append(entry.getKey()).append('=')
  31. .append(URLEncoder.encode(entry.getValue(),HTTP.UTF_8)).append('&');
  32. }
  33. sb.deleteCharAt(sb.length()-1);
  34. URLurl=newURL(sb.toString());
  35. mHttpURLConn=(HttpURLConnection)url.openConnection();
  36. mHttpURLConn.setConnectTimeout(connectTimeout);
  37. mHttpURLConn.setRequestMethod("GET");
  38. if(mHttpURLConn.getResponseCode()==HttpURLConnection.HTTP_OK){
  39. returnmHttpURLConn.getInputStream();
  40. }
  41. returnnull;
  42. }
  43. }

三、通过HTTP协议发送POST请求的具体实现

[java] view plain copy
  1. packagecom.everyone.android.net;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importjava.io.OutputStream;
  5. importjava.net.HttpURLConnection;
  6. importjava.net.URL;
  7. importjava.net.URLEncoder;
  8. importjava.util.Map;
  9. importorg.apache.http.protocol.HTTP;
  10. importcom.everyone.android.callback.ParseCallback;
  11. importcom.everyone.android.callback.ResultCallback;
  12. /**
  13. *功能描述:通过HTTP协议发送POST请求
  14. *@authorandroid_ls
  15. *
  16. */
  17. publicclassAsyncHttpPostextendsAsyncBaseRequest{
  18. /**
  19. *
  20. */
  21. privatestaticfinallongserialVersionUID=3L;
  22. publicAsyncHttpPost(Stringurl,Map<String,String>parameter,
  23. ParseCallbackhandler,ResultCallbackrequestCallback){
  24. super(url,parameter,handler,requestCallback);
  25. }
  26. @Override
  27. protectedInputStreamgetRequestResult()throwsIOException{
  28. StringBuildersb=newStringBuilder();
  29. if(parameter!=null&&!parameter.isEmpty()){
  30. for(Map.Entry<String,String>entry:parameter.entrySet()){
  31. sb.append(entry.getKey()).append('=')
  32. .append(URLEncoder.encode(entry.getValue(),HTTP.UTF_8)).append('&');
  33. }
  34. sb.deleteCharAt(sb.length()-1);
  35. }
  36. //得到实体的二进制数据
  37. byte[]entitydata=sb.toString().getBytes();
  38. URLurl=newURL(requestUrl);
  39. mHttpURLConn=(HttpURLConnection)url.openConnection();
  40. mHttpURLConn.setRequestMethod("POST");
  41. mHttpURLConn.setConnectTimeout(5*1000);
  42. //如果通过post提交数据,必须设置允许对外输出数据
  43. mHttpURLConn.setDoOutput(true);
  44. mHttpURLConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
  45. mHttpURLConn.setRequestProperty("Content-Length",String.valueOf(entitydata.length));
  46. OutputStreamoutStream=mHttpURLConn.getOutputStream();
  47. outStream.write(entitydata);
  48. outStream.flush();
  49. outStream.close();
  50. if(mHttpURLConn.getResponseCode()==HttpURLConnection.HTTP_OK){
  51. returnmHttpURLConn.getInputStream();
  52. }
  53. returnnull;
  54. }
  55. }

四、线程池类

[java] view plain copy
  1. packagecom.everyone.android.net;
  2. importjava.util.concurrent.AbstractExecutorService;
  3. importjava.util.concurrent.ArrayBlockingQueue;
  4. importjava.util.concurrent.ThreadPoolExecutor;
  5. importjava.util.concurrent.TimeUnit;
  6. importandroid.util.Log;
  7. /**
  8. *功能描述:网络请求线程池类
  9. *@authorandroid_ls
  10. */
  11. publicclassDefaultThreadPool{
  12. /**
  13. *用于保存等待执行的任务的阻塞队列。(有序的先进先出阻塞队列)
  14. */
  15. privatestaticArrayBlockingQueue<Runnable>mBlockingQueue=newArrayBlockingQueue<Runnable>(15,true);
  16. /**
  17. *线程池
  18. */
  19. privatestaticAbstractExecutorServicemThreadPoolExecutor
  20. =newThreadPoolExecutor(5,7,10,TimeUnit.SECONDS,mBlockingQueue,
  21. newThreadPoolExecutor.DiscardOldestPolicy());
  22. privatestaticDefaultThreadPoolinstance=null;
  23. publicstaticDefaultThreadPoolgetInstance(){
  24. if(instance==null){
  25. instance=newDefaultThreadPool();
  26. }
  27. returninstance;
  28. }
  29. /**
  30. *执行任务
  31. *@paramr
  32. */
  33. publicvoidexecute(Runnabler){
  34. mThreadPoolExecutor.execute(r);
  35. }
  36. /**
  37. *关闭,并等待任务执行完成,不接受新任务
  38. */
  39. publicstaticvoidshutdown(){
  40. if(mThreadPoolExecutor!=null){
  41. mThreadPoolExecutor.shutdown();
  42. Log.i(DefaultThreadPool.class.getName(),"DefaultThreadPoolshutdown");
  43. }
  44. }
  45. /**
  46. *关闭,立即关闭,并挂起所有正在执行的线程,不接受新任务
  47. */
  48. publicstaticvoidshutdownRightnow(){
  49. if(mThreadPoolExecutor!=null){
  50. mThreadPoolExecutor.shutdownNow();
  51. try{
  52. //设置超时极短,强制关闭所有任务
  53. mThreadPoolExecutor.awaitTermination(1,TimeUnit.MICROSECONDS);
  54. }catch(InterruptedExceptione){
  55. e.printStackTrace();
  56. }
  57. Log.i(DefaultThreadPool.class.getName(),"DefaultThreadPoolshutdownRightnow");
  58. }
  59. }
  60. }

五、网络请求返回的数据解析接口

[java] view plain copy
  1. packagecom.everyone.android.callback;
  2. /**
  3. *功能描述:网络请求返回的数据解析接口
  4. *@authorandroid_ls
  5. *
  6. */
  7. publicinterfaceParseCallback{
  8. /**
  9. *对网络请求返回的数据进行解析
  10. *@paramstr要解析的字符串,JSON格式或XML
  11. *@return解析的结果
  12. */
  13. publicObjectparse(Stringstr);
  14. }

六、网络请求返回的结果回调接口

[java] view plain copy
  1. packagecom.everyone.android.callback;
  2. /**
  3. *功能描述:网络请求返回的结果回调接口
  4. *@authorandroid_ls
  5. *
  6. */
  7. publicinterfaceResultCallback{
  8. publicvoidonSuccess(Objectobj);
  9. publicvoidonFail(interrorCode);
  10. }

七、应用中界面(Activity)的基类

[java] view plain copy
  1. packagecom.everyone.android;
  2. importjava.net.HttpURLConnection;
  3. importjava.util.ArrayList;
  4. importjava.util.List;
  5. importandroid.app.Activity;
  6. importandroid.os.Bundle;
  7. importandroid.os.Handler;
  8. importandroid.widget.Toast;
  9. importcom.everyone.android.net.AsyncBaseRequest;
  10. importcom.everyone.android.net.DefaultThreadPool;
  11. /**
  12. *功能描述:应用中界面(Activity)的基类
  13. *对原有的Activity类进行扩展
  14. *@authorandroid_ls
  15. */
  16. publicabstractclassAppBaseActivityextendsActivity{
  17. /**
  18. *当前activity所持有的所有网络请求
  19. */
  20. protectedList<AsyncBaseRequest>mAsyncRequests;
  21. protectedHandlermHandler;
  22. protectedDefaultThreadPoolmDefaultThreadPool;
  23. @Override
  24. protectedvoidonCreate(BundlesavedInstanceState){
  25. super.onCreate(savedInstanceState);
  26. setContentView(getLayoutId());
  27. ((EveryoneApplication)this.getApplication()).addActivity(this);
  28. mHandler=newHandler();
  29. mAsyncRequests=newArrayList<AsyncBaseRequest>();
  30. mDefaultThreadPool=DefaultThreadPool.getInstance();
  31. //初始化组件
  32. setupView();
  33. //初始化数据
  34. initializedData();
  35. }
  36. /**
  37. *布局文件ID
  38. *@return
  39. */
  40. protectedabstractintgetLayoutId();
  41. /**
  42. *初始化组件
  43. */
  44. protectedabstractvoidsetupView();
  45. /**
  46. *初始化数据
  47. */
  48. protectedabstractvoidinitializedData();
  49. @Override
  50. protectedvoidonPause(){
  51. /**
  52. *在activity销毁的时候同时设置停止请求,停止线程请求回调
  53. */
  54. cancelRequest();
  55. super.onPause();
  56. }
  57. privatevoidcancelRequest(){
  58. if(mAsyncRequests!=null&&mAsyncRequests.size()>0){
  59. for(AsyncBaseRequestrequest:mAsyncRequests){
  60. HttpURLConnectionconn=request.getRequestConn();
  61. if(conn!=null){
  62. try{
  63. conn.disconnect();
  64. System.out.println("onDestroydisconnectURL:"+conn.getURL());
  65. mAsyncRequests.remove(request);
  66. }catch(UnsupportedOperationExceptione){
  67. //donothing.
  68. }
  69. }
  70. }
  71. }
  72. }
  73. /**
  74. *显示Toast形式的提示信息
  75. *@parammessage
  76. */
  77. protectedvoidshow(Stringmessage){
  78. Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
  79. }
  80. @Override
  81. protectedvoidonDestroy(){
  82. /**
  83. *在activity销毁的时候同时设置停止请求,停止线程请求回调
  84. */
  85. cancelRequest();
  86. super.onDestroy();
  87. }
  88. }

八、测试(继承自AppBaseActivity的子类),方法的调用

[java] view plain copy
  1. Stringurl="http://www.baidu.com/";
  2. Map<String,String>parameter=newHashMap<String,String>();
  3. parameter.put("name","android_ls");
  4. parameter.put("age","23");
  5. AsyncBaseRequestasyncBaseRequest=newAsyncHttpPost(url,parameter,newParseCallback(){
  6. @Override
  7. publicObjectparse(Stringstr){
  8. //TODOAuto-generatedmethodstub
  9. returnnull;
  10. }
  11. },
  12. newResultCallback(){
  13. @Override
  14. publicvoidonSuccess(intflag,Objectobj){
  15. //TODOAuto-generatedmethodstub
  16. }
  17. @Override
  18. publicvoidonFail(intflag,interrorCode){
  19. //TODOAuto-generatedmethodstub
  20. }
  21. });
  22. mDefaultThreadPool.execute(asyncBaseRequest);
  23. mAsyncRequests.add(asyncBaseRequest);

AsyncBaseRequest的完整代码

[java] view plain copy
  1. packagecom.everyone.android.net;
  2. importjava.io.ByteArrayOutputStream;
  3. importjava.io.IOException;
  4. importjava.io.InputStream;
  5. importjava.io.Serializable;
  6. importjava.net.HttpURLConnection;
  7. importjava.util.Map;
  8. importcom.everyone.android.callback.ParseCallback;
  9. importcom.everyone.android.callback.ResultCallback;
  10. importcom.everyone.android.utils.Constant;
  11. /**
  12. *功能描述:通过HTTP协议发送网络请求线程类
  13. *@authorandroid_ls
  14. *
  15. */
  16. publicabstractclassAsyncBaseRequestimplementsRunnable,Serializable{
  17. /**
  18. *
  19. */
  20. privatestaticfinallongserialVersionUID=1L;
  21. /**
  22. *网络连接超时,默认值为5秒
  23. */
  24. protectedintconnectTimeout=5*1000;
  25. /**
  26. *网络数据读取超时,默认值为5秒
  27. */
  28. protectedintreadTimeout=5*1000;
  29. protectedvoidsetConnectTimeout(intconnectTimeout){
  30. this.connectTimeout=connectTimeout;
  31. }
  32. protectedvoidsetReadTimeout(intreadTimeout){
  33. this.readTimeout=readTimeout;
  34. }
  35. protectedStringrequestUrl;
  36. protectedMap<String,String>parameter;
  37. privateParseCallbackparseHandler;
  38. privateResultCallbackrequestCallback;
  39. protectedHttpURLConnectionmHttpURLConn;
  40. protectedInputStreammInStream;
  41. publicAsyncBaseRequest(Stringurl,Map<String,String>parameter,
  42. ParseCallbackhandler,ResultCallbackrequestCallback){
  43. this.parseHandler=handler;
  44. this.requestUrl=url;
  45. this.parameter=parameter;
  46. this.requestCallback=requestCallback;
  47. }
  48. /**
  49. *发送网络请求
  50. *
  51. *@return网络请求返回的InputStream数据流
  52. *@throwsIOException
  53. */
  54. protectedabstractInputStreamgetRequestResult()throwsIOException;
  55. @Override
  56. publicvoidrun(){
  57. try{
  58. mInStream=getRequestResult();
  59. if(mInStream!=null){
  60. Stringresult=newString(readInputStream(mInStream));
  61. Objectobj=parseHandler.parse(result);
  62. requestCallback.onSuccess(obj);
  63. }else{
  64. System.out.println("getInputStreamByHttpURLConnectionreturnresultisNULL.");
  65. }
  66. }catch(IOExceptione){
  67. requestCallback.onFail(Constant.NETWORK_REQUEST_IOEXCEPTION_CODE);//IO异常标识
  68. e.printStackTrace();
  69. }
  70. }
  71. /**
  72. *从输入流读取数据
  73. *
  74. *@paraminStream
  75. *@return
  76. *@throwsIOException
  77. *@throwsException
  78. */
  79. protectedbyte[]readInputStream(InputStreaminStream)throwsIOException{
  80. ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();
  81. byte[]buffer=newbyte[1024];
  82. intlen=0;
  83. while((len=inStream.read(buffer))!=-1){
  84. outSteam.write(buffer,0,len);
  85. }
  86. outSteam.close();
  87. inStream.close();
  88. returnoutSteam.toByteArray();
  89. }
  90. publicHttpURLConnectiongetRequestConn(){
  91. returnmHttpURLConn;
  92. }
  93. }

好了就到这里吧,后面的待续。。。

吐槽下:在CSDN上写文章,写完后你若想删除掉之前写的一部分内容,就得一行一行删,不能选中某个区域,之后一次性删除,真郁闷。我记得之前不是这样的,现在为什么会这样呢?我刚才删除写错的文字和代码就用了我五分钟左右,真的想说粗话了,但想了下,算了。我是一个文明的人,呵呵。

这一篇网络模块处理有些地方有待优化,优化处理部分请阅读下篇Android仿人人客户端(v5.7.1)——网络模块优化

更多相关文章

  1. Android(安卓)通过handler和message在子线程里面去更新UI
  2. Android(安卓)使用Get方式实现断点下载(一)
  3. android 读取网络在传输数据时的状态
  4. Android机顶盒 获取当前连接网络的Ip地址
  5. Android(安卓)启动线程OOM
  6. android计时器 message+handler; timer+timertask
  7. android socket
  8. android之AsncTask异步任务使用
  9. Android(安卓)启动activity并且获取他的返回值

随机推荐

  1. Android HttpURLConnection上传图片至Ser
  2. Android 报Error inflating class ...错
  3. android恶意程序分析 (三)
  4. android TextView setTextColor
  5. Glide 加载圆形头像和gif 图
  6. Android NFC Demo如何模拟Tag?
  7. android 优秀框架整理
  8. Android官方API Demo学习之联系人获取
  9. Manifest merger failed : uses-sdk:minS
  10. Android(安卓)使用View Gone 与 ViewStub