Android Networking
在翻译对一些知识点的理解还不到位的地方,希望不要见怪。
原文翻译自:http://www.vogella.com/tutorials/AndroidNetworking/article.html
Android中执行HTTP操作
这篇文章主要描述了在android如何通过HTTP获取web资源,主要针对Eclipse 4.4, Java 1.6 和 Android 5.0的开发环境。
1 android中http访问网络的概述
1.1可用的官方API
Android支持java标准的网络包java.net
,这个包用于访问网络的资源。在java.net包中实现HTTP网络接入的最基本的类是HttpURLConnection类。
Tip:android也支持Apache HttpClient函数库,但是这个函数库没有是不在被推荐使用的,Goole正在集中精力为提高HttpURLConnection类的实现为努力。
1.2权限要求
为了使你的应用可以接入internet,需要配置android.permission.INTERNET
权限
。
为了检测你的应用访问internet的状态,要求配置android.permission.ACCESS_NETWORK_STATE
权限。
1.3
开源的资源函数库
Android执行网络访问时笨重的。为了能够缓存和确保在在后台线程中可以执行网络操作,你需要打开和关闭连接。
为了简化这些操作,我们可以使用一些流行的开源的函数库。最流行的开源库是下面的:
· Volley
· OkHttp
2 基于android 访问网络的很好的练习
在android应用程序中你应该避免在一个用户接口里面执行耗时操作。包括读写文件和访问网络。
在android 3.0(Honeycomb)系统中如果用户调用访问网络的接口系统会抛出NetworkOnMainThreadException
的
崩溃异常。
在一个有效的android应用中执行访问网络的标准的方式是采用一个service。当一个activity或者一个fragment可能访问网络的时候,采用一个标准的service是最好的设计,因为这样在一个activity里面你的代码将会是简洁的。
Tip: 下面的代码片段是为了测试在主线程里你可以允许访问网络。这段代码片段需要在你的activity里面的onCreate()
方法里面的开始。
<span style="font-size:18px;">StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); </span>
3.用java实现http访问
Java提供了一个通用的,轻量级的Http clientAPI通过HTTP 或 HTTPS 协议访问网络资源。
接入网络的主类是java.net.URL
类和java.net.HttpURLConnection
类。
URL类用于定义当HttpURLConnection
类用于访问网络资源时的一个指向web资源的指向。
HttpURLConnection
类允许你创建一个InputStream对象。这样你就可以像处理本地文件一样调用InputStream对象并读取它。
在最新的版本里面HttpURLConnection
支持透明的响应压缩(通过头信息:Accept-Encoding: gzip,服务器名称指向,扩展的
SSL 和TLS)和一个响应缓存。
www.vogella.com这个网页你可以采用下面这段代码:
这个API是当前相当健壮的。例如:检索
<span style="font-size:18px;">try {
URL url = new URL("http://www.vogella.com");
HttpURLConnection con = (HttpURLConnection) url
.openConnection();
readStream(con.getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
private void readStream(InputStream in) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} </span>
HttpURLConnection
类的
Javadoc文档建议不要重用HttpURLConnection
类。如果你重用了,那么HttpURLConnection将没有线程事件,从而它不会在两个不同的线程间被分享。
4.
检查网络是否可用
很明显android设备不是总是可以访问网络,你可以通过下面的代码段检查当前的网络的可用状态:
<span style="font-size:18px;">public boolean isNetworkAvailable() {
ConnectivityManager cm = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
// if no network is available networkInfo will be null
// otherwise check if we are connected
if (networkInfo != null && networkInfo.isConnected()) {
return true;
}
return false;
} </span>
这个方法需要配置ACCESS_NETWORK_STATE
权限。
想到下面的一些信息大家在实际开发中可能用不到,所以暂不做翻译,望大家谅解,更多内容请查看原网址:
http://www.vogella.com/tutorials/AndroidNetworking/article.html