1. 程式人生 > >android-async-http使用總結

android-async-http使用總結

其實apache還是提供了釋放 連線資源的方法的,不過是埋得深了點。 

?
1 httpClient.getConnectionManager().shutdown();

這個shutdown並不是將手機網路斷掉,而是將建立Http連線請求時所分配的資源釋放掉。


下載最新的包可以到github:https://github.com/loopj/android-async-http

官方說明文件:http://loopj.com/android-async-http

將jar包新增到專案裡面就可以開始使用了:
第一步:
按照官方推薦,建立一個靜態的請求物件.新增基本請求功能
public class MyBaseRequest {

	public static AsyncHttpClient client = new AsyncHttpClient(); // 例項話物件
	
	static {
		client.setTimeout(10000); // 設定連結超時,如果不設定,預設為10s
	}

	public static void post(Context context,String url, RequestParams params,
			AsyncHttpResponseHandler handler) {
		client.post(context,url, params,handler);
	}

	public static void get(String urlString, JsonHttpResponseHandler res) // 不帶引數,獲取json物件或者陣列
	{
		client.get(urlString, res);
	}

	public static void get(String urlString, RequestParams params,
			JsonHttpResponseHandler res) // 帶引數,獲取json物件或者陣列
	{
		client.get(urlString, params, res);
	}

	public static void get(String uString, BinaryHttpResponseHandler bHandler) // 下載資料使用,會返回byte資料
	{
		client.get(uString, bHandler);
	}

	public static AsyncHttpClient getClient() {
		return client;
	}

以上只列舉了get和post這兩種請求方式的常用方法,一般這兩個方法就夠用了,詳細方法可以去官網檢視。
第二步,發起請求
MyBaseRequest.post(context,url,params,new AsyncHttpResponseHandler() {
			@Override
			public void onStart() {
				super.onStart();
				System.out.println("start"+url);
			}
			@Override
			public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {
			}
			
			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] responseBody, Throwable throwable) {
			}
			@Override
				public void onFinish() {
					// TODO Auto-generated method stub
					super.onFinish();
				}
		});

一共有四個回撥的方法分別是 發起請求、請求成功、請求失敗、請求完成。不管請求失敗還是成功都會呼叫請求完成這個方法。
在請求成功是得到的byte[]我們可以通過String(bytes, "UTF-8")這個方法將它轉換成String型別的字串。也可以呼叫可以直接返回String型別資料的post或者get方法。
第三步:將cookie儲存在本地
	public static PersistentCookieStore myCookieStore = new PersistentCookieStore(BaseApplication.getApplication().getApplicationContext());
	public static AsyncHttpClient client = new AsyncHttpClient(); // 例項話物件
	
	static {
		client.setTimeout(10000); // 設定連結超時,如果不設定,預設為10s
	}

	public static RequestHandle post(Context context,String url, RequestParams params,
			AsyncHttpResponseHandler handler) {
		client.setCookieStore(myCookieStore);
		client.setMaxRetriesAndTimeout(0, 10000);
		// 固定的請求頭設定
		return client.post(context,url, params,handler);
	}

通過以上程式碼的設定,任何從伺服器端獲取的cookie都會持久化儲存到myCookieStore中。
也可以在cookie中新增我們自定義的資料,如下:
BasicClientCookie newCookie = new BasicClientCookie("cookiesare", "awesome");
newCookie.setVersion(1);
newCookie.setDomain("mydomain.com");
newCookie.setPath("/");
myCookieStore.addCookie(newCookie);

第三步:取消傳送的請求
android-async-http能被取消請求的請求必須傳入一個Context,否則則沒有任何效果。
例項程式碼如下:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btn_one = (Button) findViewById(R.id.btn_one);
		btn_one.setOnClickListener(this);
		Button btn_two = (Button) findViewById(R.id.btn_two);
		btn_two.setOnClickListener(this);
		
		
		RequestParams params = new RequestParams();
		System.out.println("請求一開始");
		requestOne(this,"http://blog.csdn.net/hil2000/article/details/13949513",params);
//		requestOne.cancel(true);
		System.out.println("請求二開始");
		requestTwo(this,"http://www.ithao123.cn/content-2670929.html",params);
//		requestTwo.cancel(true);
		MyBaseRequest.client.cancelAllRequests(true);
	}

	private void requestOne(Context context,final String url,final RequestParams params) {
		requestOne = 
			MyBaseRequest.post(context,url,params,new AsyncHttpResponseHandler() {
			@Override
			public void onStart() {
				super.onStart();
				System.out.println("start"+url);
			}
			@Override
			public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {
				try {
					String info = MyBaseRequest.getStringFromByte(responseBody);
					System.out.println("請求 One 的結果");
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			}
			
			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] responseBody, Throwable throwable) {
				System.out.println("請求 One 失敗");
			}
		});
	}
	private void requestTwo(Context context,final String url,final RequestParams params) {
		requestTwo = 
			MyBaseRequest.post(context,url,params,new AsyncHttpResponseHandler() {
			@Override
			public void onStart() {
				super.onStart();
				System.out.println("start"+url);
			}
			@Override
			public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {
				try {
					String info = MyBaseRequest.getStringFromByte(responseBody);
					System.out.println("請求 Two 的結果");
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			}
			
			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] responseBody, Throwable throwable) {
				System.out.println("請求 Two 失敗");
			}
		});
	}

本框架一共提供了三中取消請求的方法:
1.cancelRequests(Context context, boolean mayInterruptIfRunning);//在AsyncHttpClient中
2.cancelAllRequests(boolean mayInterruptIfRunning);//在AsyncHttpClient中
3.cancel(boolean mayInterruptIfRunning) //在RequestHandle中
在本例中使用了第二種和第三種。第一種(cancelRequests)和第二種(cancelAllRequests)的效果是一樣的,都用來取消全部請求。而第三種取消方式(cancel(boolean mayInterruptIfRunning) //在RequestHandle中)是用來取消單個請求的。
    轉載請註明出處:http://renyuan-1991.iteye.com/blog/2249325