編輯:關於Android編程
Android中網絡請求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用這兩個類庫需要寫大量的代碼才能完成網絡post和get請求,而使用android-async-http這個庫可以大大的簡化操作,它是基於Apache’s HttpClient ,所有的請求都是獨立在UI主線程之外,通過回調方法處理請求結果,采用android Handler message 機制傳遞信息。在 iOS開發中有大名鼎鼎的ASIHttpRequest庫,用來處理網絡請求操作,今天要介紹的是一個在Android上同樣強大的網絡請求庫android-async-http(官方網址:https://loopj.com/android-async-http/),目前非常火的應用Instagram和Pinterest的Android版就是用的這個網絡請求庫。這個網絡請求庫是基於Apache HttpClient庫之上的一個異步網絡請求處理庫,網絡處理均基於Android的非UI線程,通過回調方法處理請求結果。
dependencies {
compile 'com.loopj.android:android-async-http:1.4.9'
}
AsyncHttpClient asyncHttpClient= new AsyncHttpClient();
private void asyncGetMethod() {
asyncHttpClient.get(url, new AsyncHttpResponseHandler() {//接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
// called when response HTTP status is "200 OK"
if(statusCode==200){
// Log.e("dy",new String(responseBody));
Bitmap bitmap = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length);
imageView.setImageBitmap(bitmap);//回調發生在創建它的線程中
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
});
}
callback發生在創建它的線程中,應用了Android的Handler發送消息機制。你也可以把AsyncHttpClient應用在Service中或者後台線程中,庫代碼會自動識別出它所運行的context。
當然你也可以通過RequestParams來傳遞各種參數。
private void asyncGetMethodWithParams() {
params = new RequestParams();
params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
params.put("company","zhongtong");
params.put("id","719235004847");
asyncHttpClient.get(url2,params,new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
textView.setText(responseString);
}
});
}

TextHttpResponseHandler,其繼承自AsyncHttpResponse,並將原生的字節流根據指定的encoding轉化成了string對象。同樣的方式,你可以發送json請求,代碼如下:
private void sendJsonRequest() {
params=new RequestParams();
params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
params.put("company","zhongtong");
params.put("id","719235004847");
asyncHttpClient.get(url2,params,new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// Handle resulting parsed JSON response here
try {
Log.e("dy",response.getString("result"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public class MyHttpClient {
private static final String BASE_URL="http://api.avatardata.cn";
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;
}
}
private void staticHttpClient() {
params=new RequestParams();
params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
params.put("company","zhongtong");
params.put("id","719235004847");
MyHttpClient.get(url2,params,new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// If the response is JSONObject instead of expected JSONArray
try {
String error = response.getString("result");
textView.setText(error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
上述源碼下載:源碼
調用AsyncHttpClient的get或post等方法發起網絡請求所有的請求都走了sendRequest,在sendRequest中把請求封裝為了AsyncHttpRequest,並添加到線程池執行當請求被執行時(即AsyncHttpRequest的run方法),執行AsyncHttpRequest的makeRequestWithRetries方法執行實際的請求,當請求失敗時可以重試。並在請求開始,結束,成功或失敗時向請求時傳的ResponseHandlerInterface實例發送消息基本上使用的都是AsyncHttpResponseHandler的子類,調用其onStart,onSuccess等方法返回請求結果
Android自定義控件---導航欄SlideTab(Fragment+ViewPager)
一、前言好久沒有更新過博客了,趁今天有空分享一個導航欄的自定義控件。有關此控件的demo相信在網上已經爛大街了,一搜一大把。我現在只著重分享一些我認為比較難理解的知識點。
Android For JNI(三)——C的指針,指針變量,指針常見錯誤,值傳遞,引用傳遞,返回多個值
C中比較難的這一塊,大概就是指針了,所以大家還是多翻閱一下資料,當然,如果只是想了解一下,看本篇也就夠了,不過我也盡量陳述的很詳細一.指針 要說指針,其實通俗易懂的話來
Android下拉列表spinner的實例代碼
spinner組件有點類型於HTML中的下拉框<Select></select>的樣子,讓用戶每次從下拉框中選取一個,本文為大家分享了Androi
Android 圖片開發內幕第一篇
前言:本來我是做電視應用的,但是因為公司要出手機,人員緊張,所以就抽調我去支援一下,誰叫俺是雷鋒呢!我做的一個功能就是處理手機中的應用ICON,處理無非就是美化一下,重新