天天看點

Http請求之HttpClient + AsyncTask異步請求HttpClient(以GET請求為例)AsyncTask

一般這種請求方式,我個人認為比較麻煩,因為很多請求的時候要寫很多在這個裡面,不過,這也是一種請求方式,我一般請求一張圖檔或是一段文字的時候會用到這個,但是如果請求的是與項目有關的json資料的時候,我一般會使用架構,因為這樣來的更直接,好了廢話不多說了,下面我們來說下這兩個類。

HttpClient(以GET請求為例)

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支援HTTP協定的用戶端程式設計工具包,并且它支援HTTP協定最新的版本和建議。

使用HttpClient發送請求、接收響應很簡單,一般需要如下幾步即可。

1. 建立HttpClient對象。

2. 建立請求方法的執行個體,并指定請求URL。如果需要發送GET請求,建立HttpGet對象;如果需要發送POST請求,建立HttpPost對象。

3. 調用HttpClient對象的execute(HttpUriRequest request)發送請求,該方法傳回一個HttpResponse。

4. 調用HttpResponse的getEntity()方法可擷取HttpEntity對象,該對象包裝了伺服器的響應内容。程式可通過該對象擷取伺服器的響應内容。

6. 釋放連接配接。無論執行方法是否成功,都必須釋放連接配接

好下面我們來看下如何使用,這是我以前寫的工具類裡面的;

package com.icb.Net;

import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

/**
 * Http 網絡請求工具類
 *
 */
public class X_HttpRequestUtil {
	public static final String TAG = "HttpRequestUtil";

	/**
	 * 簡單的Get請求工具類用于發送get請求到伺服器
	 * 
	 * @param requestUrl
	 *            請求的URL
	 * @param encoding
	 *            伺服器編碼集
	 * @return 傳回的json資料
	 */
	public static String HttpGetUtil(String requestUrl, String encoding) {
		String result = null;// 傳回的結果
		HttpClient client = new DefaultHttpClient();// 建立HttpClient對象
		HttpGet httpGet = new HttpGet(requestUrl);// GET請求方式
		try {
			// 調用HttpResponse的getEntity()方法可擷取HttpEntity對象,該對象包裝了伺服器的響應内容
			HttpResponse response = client.execute(httpGet);
			HttpEntity entity = response.getEntity();
			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 這裡稍有不同,判斷請求是否成功
				if (entity != null) {// 判斷是否為空
					Log.e(TAG, "請求資料成功!");
					result = EntityUtils.toString(entity, encoding);//這裡可以指定下編碼
				}else{
					result = "";
				}
			}else{
				return result;//請求失敗
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			Log.e(TAG, "關閉Client成功");
			client.getConnectionManager().shutdown();// 連接配接完畢後關閉HttpClient
		}
		return result;
	}

	/**
	 * Get請求擷取網絡圖檔
	 */
	public static Bitmap HttpGetUtil(String requestUrl) {
		Bitmap bitmap = null;// 傳回的結果
		HttpClient httpClient = new DefaultHttpClient();// 建立HttpClient對象
		HttpGet httpGet = new HttpGet(requestUrl);// GET請求方式
		try {
			// 調用HttpResponse的getEntity()方法可擷取HttpEntity對象,該對象包裝了伺服器的響應内容
			HttpResponse response = httpClient.execute(httpGet);
			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 這裡稍有不同,判斷請求是否成功
				// 将請求後的内容轉為bitmap
				HttpEntity entity = response.getEntity();
				InputStream in = entity.getContent();
				bitmap = BitmapFactory.decodeStream(in);
			} else {
				return null;
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			httpClient.getConnectionManager().shutdown();// 連接配接完畢後關閉HttpClient
		}
		return bitmap;
	}
}
           

AsyncTask

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

大緻翻譯為AsyncTask這個類容易使用,這個類可以執行背景操作,并在使用者界面上釋出結果。這個類有三個參數

AsyncTask<Params, Progress, Result>

Params 啟動任務執行的輸入參數

Progress 背景任務執行的百分比

Result 背景執行任務最終傳回的結果

這個裡面我們隻要關心兩個方法就可以了,需要重寫doInBackground和onPostExecute方法,doInBackground寫一些耗時操作,在onPostExecute中寫更新UI的代碼。

下面是一個簡單的小例子:

package com.example.netrequestdemo;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		new Count().execute(100);
	}
	
	class Count extends AsyncTask<Integer, Integer, String>{

		@Override
		protected String doInBackground(Integer... params) {
			int i = params[0];
			for (; i >= 0 ; i--) {				
				if (i == 0) {
					return "count finish";
				}
			}
			return "count not exetcute";
		}
		
		
		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			System.out.println(result);
		}
		
	}
}
           

最後我們把這兩個類結合起來用,然後我們做一個網絡圖檔請求:

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.netrequestdemo.MainActivity" >

    <ImageView
        android:id="@+id/main_img"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
           

java代碼部分:

package com.example.netrequestdemo;

import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView main_img;
	public static final String URL = "http://img.name2012.com/uploads/allimg/2014-11/16-024509_590.jpg";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		main_img = (ImageView) findViewById(R.id.main_img);
		new Count().execute(URL);
	}

	class Count extends AsyncTask<String, Integer, Bitmap> {
		@Override
		protected Bitmap doInBackground(String... params) {
			return HttpGetUtil(params[0]);
		}
		
		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			main_img.setImageBitmap(result);
		}
		
	}

	/**
	 * Get請求擷取網絡圖檔
	 */
	public static Bitmap HttpGetUtil(String requestUrl) {
		Bitmap bitmap = null;// 傳回的結果
		HttpClient httpClient = new DefaultHttpClient();// 建立HttpClient對象
		HttpGet httpGet = new HttpGet(requestUrl);// GET請求方式
		try {
			// 調用HttpResponse的getEntity()方法可擷取HttpEntity對象,該對象包裝了伺服器的響應内容
			HttpResponse response = httpClient.execute(httpGet);
			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 這裡稍有不同,判斷請求是否成功
				// 将請求後的内容轉為bitmap
				HttpEntity entity = response.getEntity();
				InputStream in = entity.getContent();
				bitmap = BitmapFactory.decodeStream(in);
			} else {
				return null;
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			httpClient.getConnectionManager().shutdown();// 連接配接完畢後關閉HttpClient
		}
		return bitmap;
	}
}
           

運作效果

Http請求之HttpClient + AsyncTask異步請求HttpClient(以GET請求為例)AsyncTask

Demo下載下傳