Android 网络数据的处理之 HttpClient

openkk 12年前

 这一章我们主要来介绍网络数据的传递与处理,相信很多读者都希望做出来的应用能跟网络上的数据进行互动,如微博,论坛之类的,这里我们就要学习网络传输与返回数据的处理,首先网络传递参数有POST跟GET两种协议,做过网页或是学习过的同学应该知道.网页每个表单中都有一个<form action="XXX" method="post">参数,这里method就是提交表单参数使用的协议,当然,协议不止这两种,还有文件上传协议,这我们以后会讲,今天我们首来就来熟悉Android中对于POST跟GET协议的应用,首先我们提供了一个HttpConnectionUtil.java的辅助类,这里面对POST跟GET进行了封装

import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.io.UnsupportedEncodingException;  import java.net.URLEncoder;  import java.util.ArrayList;  import java.util.List;  import java.util.Map;    import org.apache.http.HttpResponse;  import org.apache.http.HttpStatus;  import org.apache.http.NameValuePair;  import org.apache.http.client.ClientProtocolException;  import org.apache.http.client.HttpClient;  import org.apache.http.client.entity.UrlEncodedFormEntity;  import org.apache.http.client.methods.HttpGet;  import org.apache.http.client.methods.HttpPost;  import org.apache.http.client.methods.HttpUriRequest;  import org.apache.http.impl.client.DefaultHttpClient;  import org.apache.http.message.BasicNameValuePair;    import android.os.Handler;  import android.util.Log;    public class HttpConnectionUtil  {   public static enum HttpMethod   {    GET, POST   }     /**    * 异步连接    *     * @param url    *            网址    * @param method    *            Http方法,POST跟GET    * @param callback    *            回调方法,返回给页面或其他的数据    */   public void asyncConnect(final String url, final HttpMethod method,     final HttpConnectionCallback callback)   {    asyncConnect(url, null, method, callback);   }     /**    * 同步方法    *     * @param url    *            网址    * @param method    *            Http方法,POST跟GET    * @param callback    *            回调方法,返回给页面或其他的数据    */   public void syncConnect(final String url, final HttpMethod method,     final HttpConnectionCallback callback)   {    syncConnect(url, null, method, callback);   }     /**    * 异步带参数方法    *     * @param url    *            网址    * @param params    *            POST或GET要传递的参数    * @param method    *            方法,POST或GET    * @param callback    *            回调方法    */   public void asyncConnect(final String url,     final Map<String, String> params, final HttpMethod method,     final HttpConnectionCallback callback)   {    Handler handler = new Handler();    Runnable runnable = new Runnable()    {     public void run()     {      syncConnect(url, params, method, callback);     }    };    handler.post(runnable);   }     /**    * 同步带参数方法    *     * @param url    *            网址    * @param params    *            POST或GET要传递的参数    * @param method    *            方法,POST或GET    * @param callback    *            回调方法    */   public void syncConnect(final String url, final Map<String, String> params,     final HttpMethod method, final HttpConnectionCallback callback)   {    String json = null;    BufferedReader reader = null;      try    {     HttpClient client = new DefaultHttpClient();     HttpUriRequest request = getRequest(url, params, method);     HttpResponse response = client.execute(request);     if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)     {      reader = new BufferedReader(new InputStreamReader(response        .getEntity().getContent()));      StringBuilder sb = new StringBuilder();      for (String s = reader.readLine(); s != null; s = reader        .readLine())      {       sb.append(s);      }        json = sb.toString();     }    } catch (ClientProtocolException e)    {     Log.e("HttpConnectionUtil", e.getMessage(), e);    } catch (IOException e)    {     Log.e("HttpConnectionUtil", e.getMessage(), e);    } finally    {     try     {      if (reader != null)      {       reader.close();      }     } catch (IOException e)     {      // ignore me     }    }    callback.execute(json);   }     /**    * POST跟GET传递参数不同,POST是隐式传递,GET是显式传递    *     * @param url    *            网址    * @param params    *            参数    * @param method    *            方法    * @return    */   private HttpUriRequest getRequest(String url, Map<String, String> params,     HttpMethod method)   {    if (method.equals(HttpMethod.POST))    {     List<NameValuePair> listParams = new ArrayList<NameValuePair>();     if (params != null)     {      for (String name : params.keySet())      {       listParams.add(new BasicNameValuePair(name, params         .get(name)));      }     }     try     {      UrlEncodedFormEntity entity = new UrlEncodedFormEntity(        listParams);      HttpPost request = new HttpPost(url);      request.setEntity(entity);      return request;     } catch (UnsupportedEncodingException e)     {      // Should not come here, ignore me.      throw new java.lang.RuntimeException(e.getMessage(), e);     }    } else    {     if (url.indexOf("?") < 0)     {      url += "?";     }     if (params != null)     {      for (String name : params.keySet())      {       try       {        url += "&" + name + "="          + URLEncoder.encode(params.get(name), "UTF-8");         } catch (UnsupportedEncodingException e)       {        e.printStackTrace();       }      }     }     HttpGet request = new HttpGet(url);     return request;    }   }      /**    * 回调接口    * @author Administrator    *    */   public interface HttpConnectionCallback   {    /**     * Call back method will be execute after the http request return.     *      * @param response     *            the response of http request. The value will be null if     *            any error occur.     */    void execute(String response);   }    }

这个类也是我从网上看到的,使用起来相当方便,希望读者能学会怎样使用,其实像java学习,可以将一些有用的类或是方法定义个自己包,将它们放进去,下次要用的话只要在主程序中调用就行了,这也是面向对象重要的方法.

这里面的方法,我就没有一行一行定义说明了,里面用的都是HttpClient的中方法

接下来,我们用这个类来进行Android的应用

main.xml(模板文件)

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical" android:layout_width="match_parent"   android:layout_height="match_parent">   <EditText android:layout_width="match_parent"    android:layout_height="wrap_content" android:id="@+id/http_edit"    android:text="http://">    <requestFocus></requestFocus>   </EditText>   <RelativeLayout android:layout_width="match_parent"    android:layout_height="wrap_content" android:id="@+id/relativeLayout1">    <Button android:text="取消" android:layout_width="wrap_content"     android:id="@+id/http_cancal" android:layout_height="wrap_content"     android:layout_alignParentTop="true" android:layout_alignParentRight="true"></Button>    <Button android:text="确定" android:layout_width="wrap_content"     android:id="@+id/http_ok" android:layout_height="wrap_content"     android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/http_cancal"     android:layout_marginRight="14dp"></Button>   </RelativeLayout>   <ScrollView android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView android:id="@+id/http_text" android:text="TextView"     android:textAppearance="?android:attr/textAppearanceSmall"     android:layout_height="match_parent" android:layout_width="match_parent"></TextView>   </ScrollView>    </LinearLayout>
然后就是主Actitiv的java代码了
import android.app.Activity;  import android.os.Bundle;  import android.text.Html;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.EditText;  import android.widget.TextView;    import com.kang.http.HttpConnectionUtil;  import com.kang.http.HttpConnectionUtil.HttpConnectionCallback;  import com.kang.http.HttpConnectionUtil.HttpMethod;    public class HttpClientDemo extends Activity  {   private Button ok_btn;   private Button cancal_btn;   private EditText edit_text;   private TextView text;     @Override   protected void onCreate(Bundle savedInstanceState)   {    // TODO Auto-generated method stub    super.onCreate(savedInstanceState);    setContentView(R.layout.http_client);        //确定按钮    ok_btn = (Button) findViewById(R.id.http_ok);    ok_btn.setOnClickListener(new ClickEvent());        //取消按钮    cancal_btn = (Button) findViewById(R.id.http_cancal);    cancal_btn.setOnClickListener(new ClickEvent());        //文本编辑框    edit_text = (EditText) findViewById(R.id.http_edit);        //文本框    text = (TextView) findViewById(R.id.http_text);   }         //自定义按钮点击方法   public class ClickEvent implements OnClickListener   {      @Override    public void onClick(View v)    {     switch (v.getId())     {     case R.id.http_ok:      //网址      String url = edit_text.getText().toString().trim();            if (!url.equals("http://") && !url.equals(""))      {       //自定义类,封装了GET/POST方法,而且同样也封装了同步跟异步的方法       HttpConnectionUtil conn = new HttpConnectionUtil();       conn.asyncConnect(url, HttpMethod.GET,         new HttpConnectionCallback()         {            @Override          public void execute(String response)          {           text.setText(Html.fromHtml(response));          }         });      }        break;       case R.id.http_cancal:      edit_text.setText("http://");        break;       }      }     }  }
看里面 ClickEvent类中onClick方法中我们就使用了自定义的HttpConnectionUtil类,别急着运行了,接下来还有一步,也是最重要的,就是权限的增加,你要访问网络,肯定需要访问网络的权限,在AndroidManifest.xml中加入<uses- permission android:name="android.permission.INTERNET"></uses-permission>这一句,至于加哪里,那你可别问我了,百度或是google一下吧,呵呵,卖卖关子,现在就可以运行了,看图是不是跟我的一样
0_1318136821p6se.gif

你一定会奇怪,怎么会有其他一些代码呢?呵呵,这里我们取出的是它的源代码.OK,这一章讲完了