Android仿人人客户端(v5.7.1)——网络模块处理的架构
Android仿人人客户端(v5.7.1)——网络模块处理的架构
分类:仿人人Android客户端(v5.7.1) 2013-03-28 17:55 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- publicAsyncBaseRequest(Stringurl,Map<String,String>parameter,ParseCallbackhandler,ResultCallbackrequestCallback){}
参数列表解释:
第一个参数:网络请求URL;
第二个参数:网络请求的参数;
第三个参数:网络请求返回数据的解析器;
第四个参数:网络请求返回的结果回调接口;
网络请求具体实现抽象方法:
- protectedabstractInputStreamgetRequestResult()throwsIOException;
线程核心run()方法里面的实现:
[java] view plain copy- @Override
- publicvoidrun(){
- try{
- mInStream=getRequestResult();
- if(mInStream!=null){
- Stringresult=newString(readInputStream(mInStream));
- Objectobj=parseHandler.parse(result);
- requestCallback.onSuccess(flag,obj);
- }else{
- System.out.println("getInputStreamByHttpURLConnectionreturnresultisNULL.");
- }
- }catch(IOExceptione){
- requestCallback.onFail(flag,Constant.NETWORK_REQUEST_IOEXCEPTION_CODE);//IO异常标识
- e.printStackTrace();
- }
- }
二、通过HTTP协议发送GET请求的具体实现
[java] view plain copy- packagecom.everyone.android.net;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.net.HttpURLConnection;
- importjava.net.URL;
- importjava.net.URLEncoder;
- importjava.util.Map;
- importorg.apache.http.protocol.HTTP;
- importcom.everyone.android.callback.ParseCallback;
- importcom.everyone.android.callback.ResultCallback;
- /**
- *功能描述:通过HTTP协议发送GET请求
- *@authorandroid_ls
- *
- */
- publicclassAsyncHttpGetextendsAsyncBaseRequest{
- /**
- *
- */
- privatestaticfinallongserialVersionUID=2L;
- publicAsyncHttpGet(Stringurl,Map<String,String>parameter,
- ParseCallbackhandler,ResultCallbackrequestCallback)throwsIOException{
- super(url,parameter,handler,requestCallback);
- }
- @Override
- protectedInputStreamgetRequestResult()throwsIOException{
- StringBuildersb=newStringBuilder(requestUrl);
- sb.append('?');
- for(Map.Entry<String,String>entry:parameter.entrySet()){
- sb.append(entry.getKey()).append('=')
- .append(URLEncoder.encode(entry.getValue(),HTTP.UTF_8)).append('&');
- }
- sb.deleteCharAt(sb.length()-1);
- URLurl=newURL(sb.toString());
- mHttpURLConn=(HttpURLConnection)url.openConnection();
- mHttpURLConn.setConnectTimeout(connectTimeout);
- mHttpURLConn.setRequestMethod("GET");
- if(mHttpURLConn.getResponseCode()==HttpURLConnection.HTTP_OK){
- returnmHttpURLConn.getInputStream();
- }
- returnnull;
- }
- }
三、通过HTTP协议发送POST请求的具体实现
[java] view plain copy- packagecom.everyone.android.net;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importjava.net.HttpURLConnection;
- importjava.net.URL;
- importjava.net.URLEncoder;
- importjava.util.Map;
- importorg.apache.http.protocol.HTTP;
- importcom.everyone.android.callback.ParseCallback;
- importcom.everyone.android.callback.ResultCallback;
- /**
- *功能描述:通过HTTP协议发送POST请求
- *@authorandroid_ls
- *
- */
- publicclassAsyncHttpPostextendsAsyncBaseRequest{
- /**
- *
- */
- privatestaticfinallongserialVersionUID=3L;
- publicAsyncHttpPost(Stringurl,Map<String,String>parameter,
- ParseCallbackhandler,ResultCallbackrequestCallback){
- super(url,parameter,handler,requestCallback);
- }
- @Override
- protectedInputStreamgetRequestResult()throwsIOException{
- StringBuildersb=newStringBuilder();
- if(parameter!=null&&!parameter.isEmpty()){
- for(Map.Entry<String,String>entry:parameter.entrySet()){
- sb.append(entry.getKey()).append('=')
- .append(URLEncoder.encode(entry.getValue(),HTTP.UTF_8)).append('&');
- }
- sb.deleteCharAt(sb.length()-1);
- }
- //得到实体的二进制数据
- byte[]entitydata=sb.toString().getBytes();
- URLurl=newURL(requestUrl);
- mHttpURLConn=(HttpURLConnection)url.openConnection();
- mHttpURLConn.setRequestMethod("POST");
- mHttpURLConn.setConnectTimeout(5*1000);
- //如果通过post提交数据,必须设置允许对外输出数据
- mHttpURLConn.setDoOutput(true);
- mHttpURLConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
- mHttpURLConn.setRequestProperty("Content-Length",String.valueOf(entitydata.length));
- OutputStreamoutStream=mHttpURLConn.getOutputStream();
- outStream.write(entitydata);
- outStream.flush();
- outStream.close();
- if(mHttpURLConn.getResponseCode()==HttpURLConnection.HTTP_OK){
- returnmHttpURLConn.getInputStream();
- }
- returnnull;
- }
- }
四、线程池类
[java] view plain copy- packagecom.everyone.android.net;
- importjava.util.concurrent.AbstractExecutorService;
- importjava.util.concurrent.ArrayBlockingQueue;
- importjava.util.concurrent.ThreadPoolExecutor;
- importjava.util.concurrent.TimeUnit;
- importandroid.util.Log;
- /**
- *功能描述:网络请求线程池类
- *@authorandroid_ls
- */
- publicclassDefaultThreadPool{
- /**
- *用于保存等待执行的任务的阻塞队列。(有序的先进先出阻塞队列)
- */
- privatestaticArrayBlockingQueue<Runnable>mBlockingQueue=newArrayBlockingQueue<Runnable>(15,true);
- /**
- *线程池
- */
- privatestaticAbstractExecutorServicemThreadPoolExecutor
- =newThreadPoolExecutor(5,7,10,TimeUnit.SECONDS,mBlockingQueue,
- newThreadPoolExecutor.DiscardOldestPolicy());
- privatestaticDefaultThreadPoolinstance=null;
- publicstaticDefaultThreadPoolgetInstance(){
- if(instance==null){
- instance=newDefaultThreadPool();
- }
- returninstance;
- }
- /**
- *执行任务
- *@paramr
- */
- publicvoidexecute(Runnabler){
- mThreadPoolExecutor.execute(r);
- }
- /**
- *关闭,并等待任务执行完成,不接受新任务
- */
- publicstaticvoidshutdown(){
- if(mThreadPoolExecutor!=null){
- mThreadPoolExecutor.shutdown();
- Log.i(DefaultThreadPool.class.getName(),"DefaultThreadPoolshutdown");
- }
- }
- /**
- *关闭,立即关闭,并挂起所有正在执行的线程,不接受新任务
- */
- publicstaticvoidshutdownRightnow(){
- if(mThreadPoolExecutor!=null){
- mThreadPoolExecutor.shutdownNow();
- try{
- //设置超时极短,强制关闭所有任务
- mThreadPoolExecutor.awaitTermination(1,TimeUnit.MICROSECONDS);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- Log.i(DefaultThreadPool.class.getName(),"DefaultThreadPoolshutdownRightnow");
- }
- }
- }
五、网络请求返回的数据解析接口
[java] view plain copy- packagecom.everyone.android.callback;
- /**
- *功能描述:网络请求返回的数据解析接口
- *@authorandroid_ls
- *
- */
- publicinterfaceParseCallback{
- /**
- *对网络请求返回的数据进行解析
- *@paramstr要解析的字符串,JSON格式或XML
- *@return解析的结果
- */
- publicObjectparse(Stringstr);
- }
六、网络请求返回的结果回调接口
[java] view plain copy- packagecom.everyone.android.callback;
- /**
- *功能描述:网络请求返回的结果回调接口
- *@authorandroid_ls
- *
- */
- publicinterfaceResultCallback{
- publicvoidonSuccess(Objectobj);
- publicvoidonFail(interrorCode);
- }
七、应用中界面(Activity)的基类
[java] view plain copy- packagecom.everyone.android;
- importjava.net.HttpURLConnection;
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.widget.Toast;
- importcom.everyone.android.net.AsyncBaseRequest;
- importcom.everyone.android.net.DefaultThreadPool;
- /**
- *功能描述:应用中界面(Activity)的基类
- *对原有的Activity类进行扩展
- *@authorandroid_ls
- */
- publicabstractclassAppBaseActivityextendsActivity{
- /**
- *当前activity所持有的所有网络请求
- */
- protectedList<AsyncBaseRequest>mAsyncRequests;
- protectedHandlermHandler;
- protectedDefaultThreadPoolmDefaultThreadPool;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(getLayoutId());
- ((EveryoneApplication)this.getApplication()).addActivity(this);
- mHandler=newHandler();
- mAsyncRequests=newArrayList<AsyncBaseRequest>();
- mDefaultThreadPool=DefaultThreadPool.getInstance();
- //初始化组件
- setupView();
- //初始化数据
- initializedData();
- }
- /**
- *布局文件ID
- *@return
- */
- protectedabstractintgetLayoutId();
- /**
- *初始化组件
- */
- protectedabstractvoidsetupView();
- /**
- *初始化数据
- */
- protectedabstractvoidinitializedData();
- @Override
- protectedvoidonPause(){
- /**
- *在activity销毁的时候同时设置停止请求,停止线程请求回调
- */
- cancelRequest();
- super.onPause();
- }
- privatevoidcancelRequest(){
- if(mAsyncRequests!=null&&mAsyncRequests.size()>0){
- for(AsyncBaseRequestrequest:mAsyncRequests){
- HttpURLConnectionconn=request.getRequestConn();
- if(conn!=null){
- try{
- conn.disconnect();
- System.out.println("onDestroydisconnectURL:"+conn.getURL());
- mAsyncRequests.remove(request);
- }catch(UnsupportedOperationExceptione){
- //donothing.
- }
- }
- }
- }
- }
- /**
- *显示Toast形式的提示信息
- *@parammessage
- */
- protectedvoidshow(Stringmessage){
- Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
- }
- @Override
- protectedvoidonDestroy(){
- /**
- *在activity销毁的时候同时设置停止请求,停止线程请求回调
- */
- cancelRequest();
- super.onDestroy();
- }
- }
八、测试(继承自AppBaseActivity的子类),方法的调用
[java] view plain copy- Stringurl="http://www.baidu.com/";
- Map<String,String>parameter=newHashMap<String,String>();
- parameter.put("name","android_ls");
- parameter.put("age","23");
- AsyncBaseRequestasyncBaseRequest=newAsyncHttpPost(url,parameter,newParseCallback(){
- @Override
- publicObjectparse(Stringstr){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- },
- newResultCallback(){
- @Override
- publicvoidonSuccess(intflag,Objectobj){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonFail(intflag,interrorCode){
- //TODOAuto-generatedmethodstub
- }
- });
- mDefaultThreadPool.execute(asyncBaseRequest);
- mAsyncRequests.add(asyncBaseRequest);
AsyncBaseRequest的完整代码
[java] view plain copy- packagecom.everyone.android.net;
- importjava.io.ByteArrayOutputStream;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.Serializable;
- importjava.net.HttpURLConnection;
- importjava.util.Map;
- importcom.everyone.android.callback.ParseCallback;
- importcom.everyone.android.callback.ResultCallback;
- importcom.everyone.android.utils.Constant;
- /**
- *功能描述:通过HTTP协议发送网络请求线程类
- *@authorandroid_ls
- *
- */
- publicabstractclassAsyncBaseRequestimplementsRunnable,Serializable{
- /**
- *
- */
- privatestaticfinallongserialVersionUID=1L;
- /**
- *网络连接超时,默认值为5秒
- */
- protectedintconnectTimeout=5*1000;
- /**
- *网络数据读取超时,默认值为5秒
- */
- protectedintreadTimeout=5*1000;
- protectedvoidsetConnectTimeout(intconnectTimeout){
- this.connectTimeout=connectTimeout;
- }
- protectedvoidsetReadTimeout(intreadTimeout){
- this.readTimeout=readTimeout;
- }
- protectedStringrequestUrl;
- protectedMap<String,String>parameter;
- privateParseCallbackparseHandler;
- privateResultCallbackrequestCallback;
- protectedHttpURLConnectionmHttpURLConn;
- protectedInputStreammInStream;
- publicAsyncBaseRequest(Stringurl,Map<String,String>parameter,
- ParseCallbackhandler,ResultCallbackrequestCallback){
- this.parseHandler=handler;
- this.requestUrl=url;
- this.parameter=parameter;
- this.requestCallback=requestCallback;
- }
- /**
- *发送网络请求
- *
- *@return网络请求返回的InputStream数据流
- *@throwsIOException
- */
- protectedabstractInputStreamgetRequestResult()throwsIOException;
- @Override
- publicvoidrun(){
- try{
- mInStream=getRequestResult();
- if(mInStream!=null){
- Stringresult=newString(readInputStream(mInStream));
- Objectobj=parseHandler.parse(result);
- requestCallback.onSuccess(obj);
- }else{
- System.out.println("getInputStreamByHttpURLConnectionreturnresultisNULL.");
- }
- }catch(IOExceptione){
- requestCallback.onFail(Constant.NETWORK_REQUEST_IOEXCEPTION_CODE);//IO异常标识
- e.printStackTrace();
- }
- }
- /**
- *从输入流读取数据
- *
- *@paraminStream
- *@return
- *@throwsIOException
- *@throwsException
- */
- protectedbyte[]readInputStream(InputStreaminStream)throwsIOException{
- ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();
- byte[]buffer=newbyte[1024];
- intlen=0;
- while((len=inStream.read(buffer))!=-1){
- outSteam.write(buffer,0,len);
- }
- outSteam.close();
- inStream.close();
- returnoutSteam.toByteArray();
- }
- publicHttpURLConnectiongetRequestConn(){
- returnmHttpURLConn;
- }
- }
好了就到这里吧,后面的待续。。。
吐槽下:在CSDN上写文章,写完后你若想删除掉之前写的一部分内容,就得一行一行删,不能选中某个区域,之后一次性删除,真郁闷。我记得之前不是这样的,现在为什么会这样呢?我刚才删除写错的文字和代码就用了我五分钟左右,真的想说粗话了,但想了下,算了。我是一个文明的人,呵呵。
这一篇网络模块处理有些地方有待优化,优化处理部分请阅读下篇Android仿人人客户端(v5.7.1)——网络模块优化
更多相关文章
- Android(安卓)通过handler和message在子线程里面去更新UI
- Android(安卓)使用Get方式实现断点下载(一)
- android 读取网络在传输数据时的状态
- Android机顶盒 获取当前连接网络的Ip地址
- Android(安卓)启动线程OOM
- android计时器 message+handler; timer+timertask
- android socket
- android之AsncTask异步任务使用
- Android(安卓)启动activity并且获取他的返回值