Android中构建数据业务应用

来源:互联网 发布:淘宝装修海报 编辑:程序博客网 时间:2024/04/29 20:48

构建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();
}

以下是结构示意图



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

    4: WebKit中Http访问架构解析
    下面是模型结构图:
    
把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
            
         }
};

原创粉丝点击