android-async-http框架庫的簡單使用
原連結:http://blog.csdn.net/yanbober/article/details/45307549
開源專案連結
Android-async-http倉庫:Git clone https://github.com/loopj/android-async-http
android-async-http主頁:http://loopj.com/android-async-http/
背景知識
開始使用分析前還是先了解下Android的HTTP一些過往趣事:
HttpClient擁有眾多的API,實現穩定,bug很少。
HttpURLConnection是一種多用途、輕量的HTTP客戶端,使用它來進行HTTP操作可以適用於大多數的應用程式。HttpURLConnection的API比較簡單、擴充套件容易。不過在Android 2.2版本之前,HttpURLConnection一直存在著一些bug。
比如說對一個可讀的InputStream呼叫close()方法時,就有可能會導致連線池失效了。所以說2.2之前推薦使用HttpClient,2.2之後推薦HttpURLConnection。
好了,那現在話又說回來,在android-async-http中使用的是HttpClient。哎…好像在Volley中分析過Volley對不同版本進行了判斷,所以針對不同版本分別使用了HttpClient和HttpURLConnection。還是google牛逼啊!
回過神繼續android-async-http吧,不瞎扯了。android-async-http是專門針對Android在Apache的HttpClient基礎上構建的非同步http連線。所有的請求全在UI(主)執行緒之外執行,而callback使用了Android的Handler傳送訊息機制在建立它的執行緒中執行。
類似Volley一樣,使用一個優秀框架之前就是必須得先知道他的特性,如下就是android-async-http的特性:
-
傳送非同步http請求,在匿名callback物件中處理response資訊;
-
http請求發生在UI(主)執行緒之外的非同步執行緒中;
-
內部採用執行緒池來處理併發請求;
-
通過RequestParams類構造GET/POST;
-
內建多部分檔案上傳,不需要第三方庫支援;
-
流式Json上傳,不需要額外的庫;
-
能處理環行和相對重定向;
-
和你的app大小相比來說,庫的size很小,所有的一切只有90kb;
-
在各種各樣的移動連線環境中具備自動智慧請求重試機制;
-
自動的gzip響應解碼;
-
內建多種形式的響應解析,有原生的位元組流,string,json物件,甚至可以將response寫到檔案中;
-
永久的cookie儲存,內部實現用的是Android的SharedPreferences;
-
通過BaseJsonHttpResponseHandler和各種json庫整合;
-
支援SAX解析器;
-
支援各種語言和content編碼,不僅僅是UTF-8;
整體操作流程
android-async-http最簡單基礎的使用只需如下步驟:
-
建立一個AsyncHttpClient;
-
(可選的)通過RequestParams物件設定請求引數;
-
呼叫AsyncHttpClient的某個get方法,傳遞你需要的(成功和失敗時)callback介面實現,一般都是匿名內部類,實現了AsyncHttpResponseHandler,類庫自己也提供許多現成的response handler,你一般不需要自己建立。
AsyncHttpClient與AsyncHttpResponseHandler基礎GET體驗
AsyncHttpClient類通常用在android應用程式中建立非同步GET, POST, PUT和DELETE HTTP請求,請求引數通過RequestParams例項建立,響應通過重寫匿名內部類ResponseHandlerInterface方法處理。
如下程式碼展示了使用AsyncHttpClient與AsyncHttpResponseHandler的基礎操作:
AsyncHttpClient client = new AsyncHttpClient();
client.get("www.baidu.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onFinish() {
super.onFinish();
}
@Override
public void onRetry(int retryNo) {
super.onRetry(retryNo);
}
@Override
public void onCancel() {
super.onCancel();
}
@Override
public void onProgress(int bytesWritten, int totalSize) {
super.onProgress(bytesWritten, totalSize);
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
官方推薦AsyncHttpClient靜態例項化的封裝
注意:官方推薦使用一個靜態的AsyncHttpClient,官方示例程式碼如下:
public class TwitterRestClient {
private static final String BASE_URL = "http://api.twitter.com/1/";
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
}
public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.post(getAbsoluteUrl(url), params, responseHandler);
}
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
通過官方這個推薦例子可以發現,我們在用時可以直接通過類名呼叫需要的請求方法。所以我們可以自己多封裝一些不同的請求方法,比如引數不同的方法,下載方法,上傳方法等。
RequestParams的基礎使用
RequestParams params = new RequestParams();
params.put("username", "yanbober");
params.put("password", "123456");
params.put("email", "yanbobersky@email.com");
/*
* Upload a File
*/
params.put("file_pic", new File("test.jpg"));
params.put("file_inputStream", inputStream);
params.put("file_bytes", new ByteArrayInputStream(bytes));
/*
* url params: "user[first_name]=jesse&user[last_name]=yan"
*/
Map<String, String> map = new HashMap<String, String>();
map.put("first_name", "jesse");
map.put("last_name", "yan");
params.put("user", map);
/*
* url params: "what=haha&like=wowo"
*/
Set<String> set = new HashSet<String>();
set.add("haha");
set.add("wowo");
params.put("what", set);
/*
* url params: "languages[]=Java&languages[]=C"
*/
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("C");
params.put("languages", list);
/*
* url params: "colors[]=blue&colors[]=yellow"
*/
String[] colors = { "blue", "yellow" };
params.put("colors", colors);
/*
* url params: "users[][age]=30&users[][gender]=male&users[][age]=25&users[][gender]=female"
*/
List<Map<String, String>> listOfMaps = new ArrayList<Map<String, String>>();
Map<String, String> user1 = new HashMap<String, String>();
user1.put("age", "30");
user1.put("gender", "male");
Map<String, String> user2 = new HashMap<String, String>();
user2.put("age", "25");
user2.put("gender", "female");
listOfMaps.add(user1);
listOfMaps.add(user2);
params.put("users", listOfMaps);
/*
* 使用例項
*/
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://localhost:8080/androidtest/", params, responseHandler);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
JsonHttpResponseHandler帶Json引數的POST
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", "ryantang");
StringEntity stringEntity = new StringEntity(jsonObject.toString());
client.post(mContext, "http://api.com/login", stringEntity, "application/json", new JsonHttpResponseHandler(){
@Override
public void onSuccess(JSONObject jsonObject) {
super.onSuccess(jsonObject);
}
});
} catch (JSONException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
BinaryHttpResponseHandler下載檔案
client.get("http://download/file/test.java", new BinaryHttpResponseHandler() {
@Override
public void onSuccess(byte[] arg0) {
super.onSuccess(arg0);
File file = Environment.getExternalStorageDirectory();
File file2 = new File(file, "down");
file2.mkdir();
file2 = new File(file2, "down_file.jpg");
try {
FileOutputStream oStream = new FileOutputStream(file2);
oStream.write(arg0);
oStream.flush();
oStream.close();
} catch (Exception e) {
e.printStackTrace();
Log.i(null, e.toString());
}
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
RequestParams上傳檔案
File myFile = new File("/sdcard/test.java");
RequestParams params = new RequestParams();
try {
params.put("filename", myFile);
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://update/server/location/", params, new AsyncHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, String content) {
super.onSuccess(statusCode, content);
}
});
} catch(FileNotFoundException e) {
e.printStackTrace();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
PersistentCookieStore持久化儲存cookie
官方文件裡說PersistentCookieStore類用於實現Apache HttpClient的CookieStore介面,可自動將cookie儲存到Android裝置的SharedPreferences中,如果你打算使用cookie來管理驗證會話,這個非常有用,因為使用者可以保持登入狀態,不管關閉還是重新開啟你的app。
文件裡介紹了持久化Cookie的步驟:
-
建立 AsyncHttpClient例項物件;
-
將客戶端的cookie儲存到PersistentCookieStore例項物件,帶有activity或者應用程式context的構造方法;
-
任何從伺服器端獲取的cookie都會持久化儲存到myCookieStore中,新增一個cookie到儲存中,只需要構造一個新的cookie物件,並且呼叫addCookie方法;
下面這個例子就是鐵證:
AsyncHttpClient client = new AsyncHttpClient();
PersistentCookieStore cookieStore = new PersistentCookieStore(this);
client.setCookieStore(cookieStore);
BasicClientCookie newCookie = new BasicClientCookie("name", "value");
newCookie.setVersion(1);
newCookie.setDomain("mycompany.com");
newCookie.setPath("/");
cookieStore.addCookie(newCookie);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
相關文章
- vue框架的簡單使用Vue框架
- Fresco框架SimpleDraweeView控制元件的簡單使用框架View控制元件
- okhttp網路請求框架的簡單使用HTTP框架
- react-color庫的簡單使用React
- python requests庫的簡單使用Python
- Solon Auth 認證框架使用演示(更簡單的認證框架)框架
- Python爬蟲 --- 2.3 Scrapy 框架的簡單使用Python爬蟲框架
- avalon框架,簡單的MVVM框架MVVM
- Gin 框架的簡單搭建框架
- MySQL資料庫的基本使用簡單易懂MySql資料庫
- 一個簡簡單單的紅點系統框架框架
- Feacar分散式事務框架簡單使用分散式框架
- Spring Boot:簡單使用EhCache快取框架Spring Boot快取框架
- 使用Go語言實現簡單MapReduce框架Go框架
- [Rust]使用Rocket框架搭建簡單Web服務Rust框架Web
- 簡單易懂的JSON框架JSON框架
- 影象處理庫GPUImage簡單使用GPUUI
- 記錄 golang 命令列庫 cobra 的簡單使用Golang命令列
- 簡單介紹標準庫fmt的基本使用
- HttpUrlConnection和HttpClient和android-async-http框架的GET和POST請求HTTPclientAndroid框架
- 關於 PHP 框架的簡單思考PHP框架
- Java學習筆記—開源框架Netty的簡單使用Java筆記框架Netty
- 簡單介紹.Net效能測試框架Crank的使用方法框架
- 簡單的js工具庫JS
- Golang學習筆記 – 標準庫”net/http”的簡析及自制簡單路由框架Golang筆記HTTP路由框架
- 使用Python和requests庫的簡單爬蟲程式Python爬蟲
- 使用JavaScript手寫一個簡單的快捷鍵庫JavaScript
- Kdevelop的簡單使用和簡單除錯dev除錯
- spingMVC框架簡單配置MVC框架
- 簡單的使用rman備份oracle資料庫的做法Oracle資料庫
- docker的簡單使用Docker
- postman的簡單使用Postman
- RecyclerView的簡單使用View
- git的簡單使用Git
- LayUi的簡單使用UI
- RocketMQ的簡單使用MQ
- Vue簡單的使用Vue
- Cookie的簡單使用Cookie