(原创出处为本博客:)
目录:
前言
准备工作
开发模式
开发原则
线程
高并发
TCP/UDP
本类介绍
开发选择
功能列表
优点
拓展
完整代码
用法例子
前言:
已开源到GitHub,希望大家能够和我一起来完善它,该类肯定有很多不足的,但总体来说,还是不错的。
为什么要写这个东西?原因如下:
在此之前已经有很多不错的网络请求框架广为人知了,例如 android-async-http,okHttp等,这类优秀的框架其底层的实现也是基于系统的 线程池 和 httpClient 或 HttpUrlConnection,我相信很多开发者在使用这些框架的时候自己是没有去了解这些东西的。
作为一个合格的Android开发者,我觉得必须要会自己使用系统的SDK提供的API来实现功能,并不是不建议使用框架,只是建议在能够在独立地,不依赖百度,完全断网的情况下去使用现有的资源来实现需求功能后,再去使用这些框架,这样不至于成为“框架工程师”,而且,在面试的时候,也能信心十足!
本文不仅仅是对Java/Android而言,同样的建议可以折射到其他语言的开发上。
准备工作
,例如单例、观察者、简单工厂等。要开发框架,使用开发模式的必须的,无论是从代码解耦或者是内存优化方面上去看都是必不可少,前者有ImageLoader采用了双从判断类型的单例模式,包括Android我们熟悉的事件机制,它是观察者模式,还有适配器模式。
2,了解并使用一些开发原则,注意哦,这里是原则哦,例如接口分离,一个大的项目没几个接口怎么行,而且接口能够我们带来很大的方便。
3,了解并学会使用线程以及优化,网络请求类框架,我们知道Android中是不能在主线程中(又称UI线程)进行网络操作的,那么我们的框架中必不可少地要使用到子线程,这就需要你掌握线程类知识,例如简单的 Thread + Runnable + Handler 组合拳,再重量级点的就使用 AsyncTask。
4,处理好高并发,一个应用中往往要进行多线程操作,而Java虚拟机对于一个线程的内存分配大约在1M左右,具体多少要看它执行的任务而定。看到线程高并发这些字,第一想到的应该是 线程池,所以线程池你需要去了解并学会灵活使用。
5,了解 Tcp/Udp 数据包的结构以及 Post 的方式差别。还记得有很多招聘条件里面有很多要求要了解 TCP协议的要求不?如果你看到这样的要求的时候,心里默念这个要求有什么用的话,那就证明你还没真正地去使用过它,这点等下留意下我的代码注释。
6,其他 (例如一个编译器....)
本类介绍
还是不要说框架了,说类吧,哈哈,不要那么高大上。接着在上面的准备工作中谈到的点,下面我来意义对应解释,它们是怎样被用到这个 Http工具类里面的。
public static LghHttp getInstance(){ return LghHttpStatic.singleLghHttp; } LghHttpStatic{ private static LghHttp singleLghHttp = new LghHttp(); }
2,在开发原则上面,采用了接口分离,主要体现在数据处理方面。
LghHttpBaseListenr{ void onFailed(int type); // void onUrlFailed(); // void onTimeOut(); // void onProtocolFailed(); // void onEncodingFailed(); // void onIoFailed(); } LghHttpGlobleListener extends LghHttpBaseListenr{ void onSuccess(int requestCode,String response); } LghHttpSingleListener extends LghHttpBaseListenr{ void onSuccess(String response); }
init(){ 3 this.threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(3); 4 this.handler = new Handler(){ 5 @Override handleMessage(Message msg) { 7 super.handleMessage(msg); 8 9 HttpDataBean bean = (HttpDataBean) msg.obj; 10 LghHttpBaseListenr tempListener; tempListener = GloblelghHttpListeners; 13 }else if(bean.getListeners()!=null){ 14 tempListener = bean.getListeners(); 15 }else{ 16 return; 17 } 18 switch (msg.what){ 19 case Success: GloblelghHttpListeners.onSuccess(msg.arg1,bean.getResponse()); 22 }else{ 23 bean.getListeners().onSuccess(bean.getResponse()); 24 } 25 break; 26 case UrlFailed: 27 tempListener.onFailed(UrlFailed); 28 break; 29 case TimeOut: 30 tempListener.onFailed(TimeOut); 31 break; 32 case ProtocolFailed: 33 tempListener.onFailed(ProtocolFailed); 34 break; 35 case EncodingFailed: 36 tempListener.onFailed(EncodingFailed); 37 break; 38 case IOFailed: 39 tempListener.onFailed(IOFailed); 40 break; 41 default: ; 44 } 45 } 46 }; 47 }
View Code4,功能方面,提供了三种常见操作:
1)Get 请求操作