关于Android 网络接口,android.net.* 实际上是通过对Apache 的HttpClient 的封装来实现的
一个HTTP 编程接口,它实现了HttpClient 接口,同时还提供了HTTP 请求队列管理,以及HTTP
连接池管理,以提高并发请求情况下(如转载网页时)的处理效率,除此之外还有网络状态监视等
接口。AndroidHttpClient 等类从2.2 版,也就是API Level 8 才开始提供。
AndroidHttpClient 不允许在主线程里启动,如果看到“This thread forbids HTTP requests,则
表示在主线程中使用了AndroidHttpClient。因为这个原因,在处理Android 网络接口,就不能和
Java 标准网络接口和Apache 网络接口那样轻易地做网络操作。那么,Android 网络接口是怎样操
作网络的呢?这时候就引进了异步的概念,在Android 平台中,它提供非常好的异步接口
AsyncTask。
AsyncTask 是Android 1.5 提供的一个工具类,它使创建需要与用户界面交互的长时间运行的任
务变得更简单。不需要借助线程和Handler 即可实现。后续有一个异步下载的例子会详细讲解,此
处不作详细研究
实例:
下面看AndroidHttpClient 结合AsyncTask 完成网络操作的一个简单例子
package com.pms.main;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.content.Context;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
public class NetAndroidActivity extends Activity {
TextView textView_1 = null;
String httpUrl = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 得到控件
textView_1 = (TextView) this.findViewById(R.id.textView_1);
//调用AsyncTask
NetAndroidTask task = new NetAndroidTask(this);
//执行异步,并传入参数列表
task.execute("http://192.168.1.7:8080/exa/index.jsp","testParam1=110","testParam
2=NetAndroidActivity");
}
class NetAndroidTask extends AsyncTask<String, Integer, String> {
//构造函数
public NetAndroidTask(Context context) {
}
@Override
protected String doInBackground(String... params) {
//声明变量
AndroidHttpClient client = null;
HttpGet httpRequest = null;
HttpResponse httpResponse = null;
try {
httpUrl = params[0]+"?"+params[1]+"&"+params[2];//通过参数列表组装路径
// 构造AndroidHttpClient 的实例
client = AndroidHttpClient.newInstance("Android");
// 创建HttpGet 方法,该方法会自动处理URL 地址的重定向
httpRequest = new HttpGet(httpUrl);
// 请求HttpClient,取得HttpResponse
httpResponse = client.execute(httpRequest);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_
OK) {
// 取得返回的字符串
String strResult = EntityUtils.toString(httpResponse
.getEntity());
return strResult;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
if (client != null)
client.close();
}
return null;
} @
Override
protected void onPostExecute(String result) {
// 返回HTML 页面的内容
textView_1.setText(result);
}
}
}
“代码解释”
代码中,向http://192.168.1.7:8080/exa/index.jsp 分别传入了两
个参数, 注意task.execute() 传递的参数列表和接收数时
params[0] 、params[1]、params[2]分别接收传递的参数。
该例子用的是GET 提交方式,但Post 方式
核心代码基本上和Apache 网络接口的Post 方式相同。本例中得到网络连接实例是通过
AndroidHttpClient.newInstance()得到,Apache 网络接口是通过new DefaultHttpClient()。
3 种网络连接的方法在以上例子中都作了简单介绍,在正常开发应用中,读者可以按照应用网
络特点和自己爱好选择运用哪种操作方式,一般有具有Java 编程基础的读者往往会选择Java 标准
接口,追求简洁、快速开发的会选择Apache 网络接口,可能因为Android 网络接口在2.0 版本才
被运用,以及主线程中不允许使用造成很多开发者不去运用它。但Android 网络接口是对Apache
网络接口的完美封装,更加适合Android 平台的开发和运用。
在真正Android 网络开发过程中,面对复杂的网络操作和多变的情况,仅仅学会上面3 种是不
行的,但基础部分还是这些