构建Android中的数据业务应用,Android提供了几种网络访问方式: 移动IP网络(GPRS,基于移动网络的数据应用层 ),WiFi,蓝牙。这里讨论的是基于第一种方式的网络应用。Android主要提供了java.net和org.apache.httpclient两个包来处理相关的网络应用,另外还有android.net这个包,它只是对org.apache.httpclient进行了简单的封装,所以重点介绍apache包的应用,当然也会对java.net作简单介绍。

1:检查网络连接状态
Android提供各种后台Service以便我们可以获得系统共用对象的实例,ConectivityManager是用来检查网络连接的类,下面代码是它通用使用方法:
ConnectivityManager mConnMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

2:Android中简单的Http访问
首先通过一个简单的例子使用标准的Java.net API 通过Http Get方法来从指定URL获得一个简单的Html流。Http Get请求只需要把查询参数放入请求的URL中,
private String getHttpResponse(String location) {
String result = null;
URL url = null;
try {
url = new URL(location); //构造一个URL对象
} catch (MalformedURLException e) {
Log.e(Constants.LOGTAG, “ERROR”, e);
}
if (url != null) {
try {
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); //使用HttpURLConnection打开连接
BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));//为输出创建BufferedReader
String inputLine;
int lineCount = 0; // limit the lines for the example
while ((lineCount < 10) && ((inputLine = in.readLine()) != null)) { //读Response中的数据
lineCount++;
result += "\n" + inputLine; #6
}
in.close();
urlConn.disconnect();
} catch (IOException e) {
Log.e(Constants.LOGTAG, “ERROR”, e);
}
} else {
Log.e(Constants.LOGTAG, " url NULL");
}
return result;
}


通过上面可以看到,通过Http访问数据在Anroid是很容易的,但是在实际应用中,通常都是复杂频繁的网络请求访问而不是如例子中简单的获取数据,如果这样的话,例子中的做法就会变得很笨重,为了对Java.net中的类可以被更好的使用,apache提供了HttpClient,它对Java.net中的类做了封装和更好的抽象,用来支持设计更复杂的Http应用,而且能在独立的线程上处理这些请求。
3:使用HttpClient
这个例子展示了怎样把网络访问请求运行的独立的线程之中,它使用了Apache的ResponseHandler和Android Handler。
private final Handler handler = new Handler() { //创建一个Android Handler
@Override
public void handleMessage(final Message msg) {
progressDialog.dismiss();
String bundleResult = msg.getData().getString("RESPONSE");//在Handler内部来处理刷新UI
ApacheHTTPSimple.this.output.setText(bundleResult);
}
};
private void performRequest() {
final ResponseHandler<String> responseHandler = new ResponseHandler<String>() { //使用ResponseHandler来创建一个异步的Http调用
public String handleResponse(HttpResponse response) {//实现OnResponse的回调函数
StatusLine status = response.getStatusLine();
HttpEntity entity = response.getEntity();//获得Response的Entity
String result = null;
try {
result = StringUtils.inputStreamToString(entity.getContent());
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("RESPONSE", result);
message.setData(bundle);
handler.sendMessage(message); //向UI handler发送消息,把Http请求的数据传递给UI进程
} catch (IOException e) {}
return result;
}
};
this.progressDialog = ProgressDialog.show(this, "working . . .", "performing HTTP request");
new Thread() {//使用一个独立线程进行Http请求
@Override
public void run() {
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpMethod = new HttpGet(ApacheHTTPSimple.this.urlChooser.getSelectedItem().toString());//根据URL创建一个HttpGet对象
client.execute(httpMethod, responseHandler); //通过HttpClient运行HttpGet
} catch (ClientProtocolException e) {
Log.e(Constants.LOGTAG, " " + ApacheHTTPSimple.CLASSTAG, e);
} catch (IOException e) {
Log.e(Constants.LOGTAG, " " + ApacheHTTPSimple.CLASSTAG, e);
}
}
}.start();
}

以下是结构示意图

Android中构建数据业务应用_第1张图片

现在我们已经了解了HttpClient的使用和基本的访问方法, 为了避免重复的创建代码,基于一个稳定的Http访问模型,下面通过分析WebKit的Http访问架构,来展现一个可以兼容Http Get ,Post,多任务而且容易管理结构模型。

4: WebKit中Http访问架构解析
下面是模型结构图:
Android中构建数据业务应用_第2张图片
把Http Request行为抽象到一个单例中,通过HttpClient进行Get或者Post访问。
Code

每个Task负责开启一个访问线程,与UI线程的交互都由Task来完成
Code

//类似于ResponseHandler
Code
//Demo Task,继承AbstractTask
Code

//TaskManager负责创建Task,管理Task
Code


//在UI主线程里,启动一个请求Task,
Task mTask = new DemoTask(mContext, mHandler);
TaskManager.getInstance().startTask(mTask);

下面是负责在Task与UI主进程交互的Handler
private final Handler mHandler = new Handler() { //创建一个Android Handler
@Override
public void handleMessage(final Message msg) {
switch(msg.what) {
case AbstractTask.TASK_FINISHED:
DemoTask task = (DemoTask) msg.obj;//在Handler内部来处理刷新UI

}
};

更多相关文章

  1. GridView(网络视图)的基本使用
  2. Android进阶(一)几种网络请求方式详解
  3. Android/java 多线程(五)-ThreadPoolExecutor线程池的使用
  4. Android 线程池来管理线程
  5. Android的线程使用来更新UI----Thread、Handler、Looper、TimerT
  6. Android关于线程更新UI的方法
  7. Android,UI主线程与子线程
  8. 解析Android中的main线程与子线程

随机推荐

  1. Android Touch事件
  2. android installd分析
  3. Android Jetpack之Lifecycle的源码分析
  4. Android(安卓)四个步骤集成EventBus事件
  5. 2011.09.01(5)——— android checkbox自定
  6. startActivity exposed beyond app throu
  7. Build Android Platform
  8. Android动画之translate(位移动画)
  9. Android中真正的Player
  10. Android(安卓)Studio编译使用了Maven的工