Android 网络编程之Httpclient 和HttpUrlConnection

我们知道在Android 中有两种方式来访问网络,一种是HttpClient,一种是HttpUrlConnection,所以今天就来写两个Demo,来练习这两种网络连接方式。


使用HttpClient 来连接网络

HttpClient 是Apache 的一个Http 协议类库,Android 类库对其进行了封装,可以直接使用。


使用HttpUrlConnection 来连接网络

Url(Uniform Resource Locator):统一资源定位符,不仅仅只有网址。

一个URL 有多个部分组成:

1
http://username:password@host:8080/directory/file?query#ref
Component Example value
Protocol(协议) http
Authority username:password@host:8080
User Info(用户信息) username:password
Host(主机名) host
Port(端口) 8080
File(文件) /directory/file?query
Path(路径) /directory/file
Query(语句) query
Ref ref


支持的协议有:File,Ftp,Http,Https,Jar

URL 的构造方法

1
2
URL(String spec) // 通过一个字符串传入URL 比如
new URL("http://www.google.com.hk");

使用Url 对象获取UrlConnection(HttpURLConnection 的父类) 对象

1
2
URLConnection openConnection() // 获取URLConnection
URLConnection openConnection(Proxy proxy) // 通过指定的端口获取URLConnection

通过URL 获取输入流对象

1
final InputStream openStream(); // 等同于openConnection().getInputStream(types)

获取URL 的各种属性

1
2
getPath(),getPort()......等等其他方法
也可以使用equal(Object o); 来判断两个URL 对象是否相同

获取HttpURLConnection 对象

通过URL.openConnection() 方法获取URLConnection 对象,强制转换为HttpURLConnection

通过HttpURLConnection 对象获取输入输出流

1
2
3
4
getOutputStream();
getInputStream();
// 关闭此连接
disconnect();

最后一个例子

这个例子实现了通过HttpURLConnection 访问给定的网址访问网页
并将返回的数据通过流对象打印在控制台中

错误总结:

如果连接网络操写在主线程内会出现:android.os.NetworkOnMainThreadException 异常
因此新建一个线程子类,在OnclickListener 中启动线程类。


第三方类库

对于在Android 上Http 第三方类库也有很多,优化的时候可以参考:

  • HttpClient:在早起版本,比较稳定,bug 少,但随着升级,bug 变多。
  • HttpURLConnection:轻量级,API 简单,优化,后期版本bug 少,就目前看来,比HttpClient 更合适。

Volley

Retrofit

OkHttp

android-async-http


参考