android-async-http使用總結
阿新 • • 發佈:2019-01-21
其實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