編輯:關於Android編程
Android網絡請求庫:android-async-http開源框架
之前有一篇描述了客戶端請求服務器端的方式—Post的請求方式。今天介紹一個請求服務器的一個開源庫—android-async-http庫。
1. 概念:
這個網絡請求庫是基於Apache HttpClient庫之上的一個異步網絡請求處理庫,網絡處理均基於Android的非UI線程,通過回調方法(匿名內部類)處理請求結果。
2. 特征:
(1).處理異步Http請求,並通過匿名內部類處理回調結果
**(2).**Http異步請求均位於非UI線程,不會阻塞UI操作。
(3).通過線程池處理並發請求處理文件上傳、下載,響應結果自動打包JSON格式。
3. 相應的核心類的介紹:
(1).AsyncHttpResponseHandler:請求返回處理成功、失敗、開始、完成等自定義的消息的類。
(2).BinaryHttpResponseHandler:AsyncHttpResponseHandler的子類。該類是一個字節流返回處理的類。用於處理圖片等。
(3).JsonHttpResponseHandler:AsyncHttpResponseHandler的子類。這是一個服務器與客戶端之間用Json數據交流時使用的類。客戶端請求服務器的參數是Json數據類型的,服務器返回給客戶端的數據也是Json數據類型的。
(4).RequestParams:封裝參數處理的類。將客戶端請求的參數封裝在該類中。
(5).AsyncHttpClient:異步客戶端請求的類。
(6).SyncHttpClient:同步客戶端請求的類。AsyncHttpClient的子類。
注意:HttpUtil這個類主要列出了我們常用的get方法,在要使用的地方,調用該類就行了。需要添加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;
/**
* 異步請求服務器
*
* @author scd
*
*/
public class AsyncJsonUtilGet {
private static final String URL = "";
private Context mContext;
/**
* 構造方法
*
* @param mContext
*/
public AsyncJsonUtilGet(Context mContext) {
super();
this.mContext = mContext;
}
/**
* 郵箱注冊
*/
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請求方式
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");
// 表示請求成功
if (errorCode.equals("0")) {
Toast.makeText(mContext, "注冊成功", Toast.LENGTH_LONG).show();
// response:返回的數據都在這個參數中,根據業務要求進行實現功能
} else {
super.onSuccess(statusCode, headers, response);
}
}
});
}
}
(2).HttpUtil.java工具類:注:需要添加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中獲取文件名稱
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;
}
}
開源之家介紹:http://open.jb51.net/project/app-framework/android-async-http.html
Android Studio 打包及引用 aar
Android Studio 打包及引用 aar1、 簡述在比較大的 Android 項目的開發中,我們經常會遇到工程、jar 包等等之間相互引用的方式。一般我們通過在
Android--Vibrator(震動模式)
main.xml代碼如下: .java代碼如下: package org.lxh.demo; import android.
Android中 多線程下載原理
計算每個線程的下載起始終止位置公式如下文件讀寫方式4中類型工程源碼目錄package cn.itcast.download;import java.io.File;imp
Android必備知識---掌握Fragment(一)
Fragment是Android API中的一個類,它代表Activity中的一部分界面;你可以在一個Activity界面中使用多個Fragment,或者在多個Activ