一、内容摘要
介绍了在Android中编写网络应用的基本方法。
二、目录
1、添加权限
2、选择HTTP Client
3、检查网络连接
4、在子线程中进行网络操作
5、连接并下载数据
6、把InputStream转换为String
三、主要内容
1、添加权限
mainifest中需要添加以下两个权限:
(1)允许程序打开网络套接字
<uses-permissionandroid:name="android.permission.INTERNET"/>
(2)允许程序获取网络信息
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
2、选择HTTP Clients
许多Android网络应用都通过HTTP传输数据,Android包括两种HTTPclients:HttpURLConnection和HttpClient,若使用Android2.3或以上版本的API,建议选择前者.
选择依据:HttpClient的子类拥有大量API,由于过于臃肿带来的兼容性问题,Android开发团队对它的维护并不活跃。相比之下,HttpURLConnection拥有轻量级API,在减少网络流量、速度以及省电方面都有较大改善,并且Android开发团队正致力于它的不断完善中。
3、检查网络连接
在连接到网络之前,应该通过getActiveNetworkInfo()和isConnected()检查网络的可用性。
示例代码:
public void myClickHandler(View view) {
...
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
// 网络操作
} else {
// 提示错误
}
...
}
4、在子线程中进行网络操作
网络操作会有延迟,不应该在主线程(UI线程)中操作。推荐使用AsyncTask类,该类可以很方便实现在子线程中进行网络操作,并且把结果返回到主线程,免除了操作thread和handle的麻烦。
5、连接并且下载数据
通过HttpURLConnection可以发送“GET”请求,在调用connect()之后,可以调用getInputStream()获取InputStream
示例:(downloadUrl方法在子线程中执行)
private String downloadUrl(String myurl) throws IOException {
InputStream is = null;
//展示网页内容的前500个字符
int len = 500;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* 毫秒*/);
conn.setConnectTimeout(15000 /*毫秒*/);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// 开始查询请求
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG, "The response is: " + response);
is = conn.getInputStream();
// 把InputStream转换为string
String contentAsString = readIt(is, len);
return contentAsString;
// 确保程序结束后关闭InputStream
} finally {
if (is != null) {
is.close();
}
}
}
6、把InputStream转换成String
得到InputStream后,应该把它解码为目标数据类型,如Bitmap:
示例:
InputStream is = null;
...
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap(bitmap);
补充上面示例中readIt方法的实现:
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
Reader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}