Android網(wǎng)絡(luò)請(qǐng)求庫(kù)android-async-http介紹
Android網(wǎng)絡(luò)請(qǐng)求庫(kù):android-async-http開(kāi)源框架
之前有一篇描述了客戶(hù)端請(qǐng)求服務(wù)器端的方式—Post的請(qǐng)求方式。今天介紹一個(gè)請(qǐng)求服務(wù)器的一個(gè)開(kāi)源庫(kù)—android-async-http庫(kù)。
1. 概念:
這個(gè)網(wǎng)絡(luò)請(qǐng)求庫(kù)是基于Apache HttpClient庫(kù)之上的一個(gè)異步網(wǎng)絡(luò)請(qǐng)求處理庫(kù),網(wǎng)絡(luò)處理均基于Android的非UI線(xiàn)程,通過(guò)回調(diào)方法(匿名內(nèi)部類(lèi))處理請(qǐng)求結(jié)果。
2. 特征:
(1).處理異步Http請(qǐng)求,并通過(guò)匿名內(nèi)部類(lèi)處理回調(diào)結(jié)果
**(2).**Http異步請(qǐng)求均位于非UI線(xiàn)程,不會(huì)阻塞UI操作。
(3).通過(guò)線(xiàn)程池處理并發(fā)請(qǐng)求處理文件上傳、下載,響應(yīng)結(jié)果自動(dòng)打包JSON格式。
3. 相應(yīng)的核心類(lèi)的介紹:
(1).AsyncHttpResponseHandler:請(qǐng)求返回處理成功、失敗、開(kāi)始、完成等自定義的消息的類(lèi)。
(2).BinaryHttpResponseHandler:AsyncHttpResponseHandler的子類(lèi)。該類(lèi)是一個(gè)字節(jié)流返回處理的類(lèi)。用于處理圖片等。
(3).JsonHttpResponseHandler:AsyncHttpResponseHandler的子類(lèi)。這是一個(gè)服務(wù)器與客戶(hù)端之間用Json數(shù)據(jù)交流時(shí)使用的類(lèi)??蛻?hù)端請(qǐng)求服務(wù)器的參數(shù)是Json數(shù)據(jù)類(lèi)型的,服務(wù)器返回給客戶(hù)端的數(shù)據(jù)也是Json數(shù)據(jù)類(lèi)型的。
(4).RequestParams:封裝參數(shù)處理的類(lèi)。將客戶(hù)端請(qǐng)求的參數(shù)封裝在該類(lèi)中。
(5).AsyncHttpClient:異步客戶(hù)端請(qǐng)求的類(lèi)。
(6).SyncHttpClient:同步客戶(hù)端請(qǐng)求的類(lèi)。AsyncHttpClient的子類(lèi)。
注意:HttpUtil這個(gè)類(lèi)主要列出了我們常用的get方法,在要使用的地方,調(diào)用該類(lèi)就行了。需要添加android-async-http-1.4.7.jar文件包。
代碼如下:
(1).AsyncJsonUtilGet.java
package com.chengdong.su.util.get;
import org.apache.http.Header;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.widget.Toast;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
/**
* 異步請(qǐng)求服務(wù)器
*
* @author scd
*
*/
public class AsyncJsonUtilGet {
private static final String URL = "";
private Context mContext;
/**
* 構(gòu)造方法
*
* @param mContext
*/
public AsyncJsonUtilGet(Context mContext) {
super();
this.mContext = mContext;
}
/**
* 郵箱注冊(cè)
*/
public void emailRegister(String email, String password, String username) {
RequestParams params = new RequestParams();
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("email", email);
jsonObject.put("password", password);
jsonObject.put("username", username);
} catch (JSONException e) {
e.printStackTrace();
}
params.put("jsonObject", jsonObject);
// get請(qǐng)求方式
HttpUtil.get(URL, params, new JsonHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers,
Throwable throwable, JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
Toast.makeText(mContext, "Register failed!", Toast.LENGTH_SHORT)
.show();
}
@Override
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
String errorCode = response.optString("ErrorCode");
// 表示請(qǐng)求成功
if (errorCode.equals("0")) {
Toast.makeText(mContext, "注冊(cè)成功", Toast.LENGTH_LONG).show();
// response:返回的數(shù)據(jù)都在這個(gè)參數(shù)中,根據(jù)業(yè)務(wù)要求進(jìn)行實(shí)現(xiàn)功能
} else {
super.onSuccess(statusCode, headers, response);
}
}
});
}
}
(2).HttpUtil.java工具類(lèi):注:需要添加jar包
package com.chengdong.su.util.get;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.BinaryHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
public class HttpUtil {
public static final String STATUS_NETWORK = "network_available";
private static AsyncHttpClient client = new AsyncHttpClient();
static {
client.setTimeout(11000);
}
public static void get(String urlString, AsyncHttpResponseHandler res) {
client.get(urlString, res);
}
public static void get(String urlString, RequestParams params,
AsyncHttpResponseHandler res) {
client.get(urlString, params, res);
}
public static void get(String urlString, JsonHttpResponseHandler res)
{
client.get(urlString, res);
}
public static void get(String urlString, RequestParams params,
JsonHttpResponseHandler res)
{
client.get(urlString, params, res);
}
public static void get(String uString, BinaryHttpResponseHandler bHandler)
{
client.get(uString, bHandler);
}
public static AsyncHttpClient getClient() {
return client;
}
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager
.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
// 從UrlConnection中獲取文件名稱(chēng)
public static String getFileName(String url) {
String fileName = null;
boolean isOK = false;
try {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
if (conn == null) {
return null;
}
Map<String, List<String>> hf = conn.getHeaderFields();
if (hf == null) {
return null;
}
Set<String> key = hf.keySet();
if (key == null) {
return null;
}
for (String skey : key) {
List<String> values = hf.get(skey);
for (String value : values) {
String result;
try {
result = value;
int location = result.indexOf("filename");
if (location >= 0) {
result = result.substring(location
+ "filename".length());
result = java.net.URLDecoder
.decode(result, "utf-8");
result = result.substring(result.indexOf("\"") + 1,
result.lastIndexOf("\""));
fileName = result
.substring(result.indexOf("=") + 1);
isOK = true;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
if (isOK) {
break;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fileName;
}
}
開(kāi)源之家介紹:http://open.jb51.net/project/app-framework/android-async-http.html
- 微信小程序 http請(qǐng)求封裝詳解及實(shí)例代碼
- 微信小程序 封裝http請(qǐng)求實(shí)例詳解
- 微信小程序 POST請(qǐng)求(網(wǎng)絡(luò)請(qǐng)求)詳解及實(shí)例代碼
- iOS開(kāi)發(fā)中使用NSURLConnection類(lèi)處理網(wǎng)絡(luò)請(qǐng)求的方法
- Android最基本的異步網(wǎng)絡(luò)請(qǐng)求框架
- Android Xutils3網(wǎng)絡(luò)請(qǐng)求的封裝詳解及實(shí)例代碼
- 實(shí)例講解Python中SocketServer模塊處理網(wǎng)絡(luò)請(qǐng)求的用法
- 微信小程序 網(wǎng)絡(luò)請(qǐng)求API詳解
- 微信小程序網(wǎng)絡(luò)請(qǐng)求的封裝與填坑之路
相關(guān)文章
android操作SQLite增刪改減實(shí)現(xiàn)代碼
android操作SQLite增刪改減實(shí)現(xiàn)代碼,學(xué)習(xí)android的朋友可以參考下。2010-11-11
Android?控件自動(dòng)貼邊實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了Android?控件自動(dòng)貼邊實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
詳解基于Android的Appium+Python自動(dòng)化腳本編寫(xiě)
這篇文章主要介紹了詳解基于Android的Appium+Python自動(dòng)化腳本編寫(xiě),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Kotlin標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法應(yīng)用詳解
Kotlin中的標(biāo)準(zhǔn)函數(shù)指的是Standard.kt文件中定義的函數(shù),任何Kotlin代碼都可以自由地調(diào)用所有的標(biāo)準(zhǔn)函數(shù)。例如let這個(gè)標(biāo)準(zhǔn)函數(shù),他的主要作用就是配合?.操作符來(lái)進(jìn)行輔助判空處理2022-12-12
通過(guò)實(shí)例簡(jiǎn)單講解Android App中的Activity組件
這篇文章主要介紹了通過(guò)Android App中的Activity組件,包括Activity的定義和繼承以及啟動(dòng)等基本知識(shí),需要的朋友可以參考下2016-04-04
Android ListView中動(dòng)態(tài)顯示和隱藏Header&Footer的方法
這篇文章主要介紹了Android ListView中動(dòng)態(tài)顯示和隱藏Header&Footer的方法及footer的兩種正確使用方法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,對(duì)listview header footer相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-08-08
android實(shí)現(xiàn)條目倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)條目倒計(jì)時(shí)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
android 對(duì)話(huà)框彈出位置和透明度的設(shè)置具體實(shí)現(xiàn)方法
在android中我們經(jīng)常會(huì)用AlertDialog來(lái)顯示對(duì)話(huà)框。通過(guò)這個(gè)對(duì)話(huà)框是顯示在屏幕中心的。但在某些程序中,要求對(duì)話(huà)框可以顯示在不同的位置。2013-07-07

