HTTP 是应用层协议,TCP 是传输层协议(位于应用层之下)。
一般来说,移动应用推荐使用 HTTP 协议,有很多优点:
1. HTTP 发展成熟
HTTP 几乎已经快成为一种通用的 Web 标准,Web Services、Open API 等等都是基于 HTTP 协议的。几乎所有数据的传输(多媒体、XML、JSON)都可以采用 HTTP。
2. 后台复用
因为很多应用,除了有移动端,还有Web端,甚至桌面端。Web 版中前后台交互,无论是页面请求还是AJAX 请求,都是采用标准 HTTP 协议。那么其他的客户端没有理由重新设计一套协议。
3. HTML 5 应用
现在不少移动产品都采用或者半采用 HTML 5 技术,那么和服务器的交互又回归到 AJAX 上。不用说,还是离不开 HTTP。
对于TCP传输层协议使用——实时推送 socket长连接
个人理解,移动端http通信经历了三代,原生SDK,封装框架,整合资源。
第一章 我们从第一代的原生态http通信——第二代的封装类库——第三代的资源整合。通过比较不同通信方式的优缺点,了解什么是volley,为什么用volley,一层层揭开他的神秘之纱。
1.原生SDK——HttpURLConnection
HttpURLConnection是java的标准类,是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。
public String userLogin(String username,String userpwd){
String urlPost = "http://xxx.com?username=" + username + "&userpwd = " + userpwd;
URL url = new URL(urlPost );
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.connect();
InputStream is = conn.getInputStream();
String s = StreamTools.readInputStream(is);
return s;
}
优点:
(1).API简单,容易使用和扩展;
(2).压缩,体积小减少网络访问的流量;
(3).速度快,较省电。
缺点:
(1).原始,封装性差;
(2).重访问自定义不方便。
(3).android2.2 前bug多 (一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了)
2.原生SDK——HttpClient
HttpClient是Apache开源子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,封装了访问http的请求头,参数,内容体,响应等等。
public String userLogin(String username,String userpwd){
HttpClient client = new DefaultHttpClient();
String urlPost = "http://xxx.com";
HttpPost httpPost = new HttPost(urlPost);
List params = new ArrayList();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("userpwd", userpwd));
HttpResponse response = client.execute(httpPost);
if(200 == response.getStatusLine().getStatusCode()){
InputStream is = response.getEntity().getContent();
String s = StreamTools.readInputStream(is);
return s;
} else {
return null;
}
}
优点:
(1).拥有众多的API;
(2).实现比较稳定;
(3).bug数量也很少;
(4).web页面访问Session、Cookie的处理方便。
缺点:
(1).API数量过多,升级和扩展难;
(2).Android团队在提升和优化HttpClient不积极。
在Android应用程序中,则可使用HttpClient来登录系统,只要应用程序使用同一个HttpClient发送请求,HttpClient会自动维护与服务器之间的Session状态,也就是说程序第一次使用HttpClient登录系统后,接下来使用HttpClient即可访问被保护页而了。而HttpURLConnection处理session比较麻烦。
注意:原生态使用
(1)AsyncTask
android轻量级的异步类,继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
优点:
l 简单,快捷
l 过程可控
缺点:
l 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.
(2)Handler
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)thread(子线程)运行并生成Message-Looper获取Message并传递给Handler,Handler逐个获取Looper中的Message,并进行UI变更。
优点:
l 结构清晰,功能定义明确
l 对于多个后台任务时,简单,清晰
缺点:
l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
原生SDK,简单易掌握,但是如果不进行封装,容易写出冗余代码。
这个时候,网络通信框架应运而生。
3.封装框架——AsyncHttpClient
在Android开发中,发送、处理http请求简直太常见了,以至于我们的代码里到处充斥着各种HttpClient和与之相关又臭又长的代码。AsyncHttpClient,把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。
AsyncHttpClient 是一个框架提供的库 可以异步传输。针对Android在Apache的HttpClient基础上构建的异步的callback-based。所有的请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。
public String userLogin(String username,String userpwd) {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("username", username);
params.put("userpwd", userpwd);
client.get("http://xxx.com", params, new AsyncHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, String response) {
//处理返回来的信息
String s = StreamTools.readInputStream(response);
return s;
}
public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {
Log.d("ERROR", error);
}
}
);
}
(1). 创建一个AsyncHttpClient;
(2). (可选的)通过RequestParams对象设置请求参数;
(3). 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
但是没有图片下载接口
4.封装框架——Universal-Image-Loader
一个开源的图片异步加载类库,该项目的目的是提供一个可重复使用的类库为异步图像加载,缓存和显示。它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关
心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Universal-Image-Loader两种处理图片的方式:
(1)loadimage
DisplayImageOptions,他可以配置一些图片显示的选项,比如图片在加载中ImageView显示的图片,是否需要使用内存缓存,是否需要使用文件缓存等等。在回调方法onLoadingComplete()中将loadedImage设置到ImageView上面就行了。
(2)displayImage
displayImage()比使用loadImage()方便很多,也不需要添加ImageLoadingListener接口,我们也不需要手动设置ImageView显示Bitmap对象,直接将ImageView作为参数传递到displayImage()中就行了,图片显示的配置选项中,我们添加了一个图片加载中ImageVIew上面显示的图片,以及图片加载出现错误显示的图片。
不提供简单http通信接口
5.整合框架——Volley
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可以说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片.
在Google IO的演讲上,其配图是一幅发射火弓箭的图,有点类似流星。特别适合处理数据量不大,但网络通信频繁,图文应用.