成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Android框架學(xué)習(xí)筆記02AndroidAsycHttp框架

kid143 / 1646人閱讀

摘要:上一篇中我們介紹了框架的基本使用方法,這一篇我們學(xué)習(xí)一下的另外一個(gè)網(wǎng)絡(luò)請求框架框架。這里需要實(shí)現(xiàn)內(nèi)部類回調(diào),框架自己有實(shí)現(xiàn)有,不需要我們自己手動(dòng)實(shí)現(xiàn),我們只需要調(diào)用即可。其中是可以選擇的,沒有請求參數(shù)可以直接設(shè)置為。

  上一篇中我們介紹了OkHttp3.0框架的基本使用方法,這一篇我們學(xué)習(xí)一下Android的另外一個(gè)網(wǎng)絡(luò)請求框架——AsyncHttpClient框架。Asynchttpclient框架是一個(gè)開源的異步網(wǎng)絡(luò)請求框架,所有的網(wǎng)絡(luò)都在Android的非UI線程中,通過回調(diào)方法處理請求結(jié)果,無論是向網(wǎng)絡(luò)請求數(shù)據(jù)還是上傳數(shù)據(jù)都非常方便,而且這個(gè)框架非常體積非常小,只有90K左右的大小,我們可以輕松使用它,下面我們介紹一下這個(gè)框架:

概述

Asynchttpclient框架有如下的特征:

處理異步Http請求,并通過匿名內(nèi)部類處理回調(diào)結(jié)果

Http異步請求均位于非UI線程,不會(huì)阻塞UI操作

通過線程池處理并發(fā)請求處理文件上傳、下載,響應(yīng)結(jié)果自動(dòng)打包JSON格式

自動(dòng)處理連接斷開時(shí)請求重連

永久的cookie保存,內(nèi)部實(shí)現(xiàn)用的是Android的SharedPreferences

通過BaseJsonHttpResponseHandler和各種json庫集成

支持SAX解析器

支持各種語言和content編碼,不僅僅是UTF-8

自動(dòng)的gzip響應(yīng)解碼

內(nèi)置多種形式的響應(yīng)解析,有原生的字節(jié)流,string,json對象,甚至可以將response寫到文件中

這里只是簡單的介紹一下,具體需要實(shí)現(xiàn)細(xì)節(jié)需要我們在開發(fā)中實(shí)際去體會(huì)。

我們來學(xué)習(xí)一下Asynchttpclient里面的具體的類:

AsyncHttpRequest類:繼承自Runnabler,被submit至線程池執(zhí)行網(wǎng)絡(luò)請求并發(fā)送start,success等消息

AsyncHttpResponseHandler類:接收請求結(jié)果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息

TextHttpResponseHandler類:繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結(jié)果由byte數(shù)組轉(zhuǎn)換為String

JsonHttpResponseHandler類:繼承自TextHttpResponseHandler,同樣是重寫onSuccess和onFailure方法,將請求結(jié)果由String轉(zhuǎn)換為JSONObject或JSONArray

BaseJsonHttpResponseHandler類:繼承自TextHttpResponseHandler,是一個(gè)泛型類,提供了parseResponse方法,子類需要提供實(shí)現(xiàn),將請求結(jié)果解析成需要的類型,子類可以靈活地使用解析方法,可以直接原始解析,使用gson等

RequestParams類:請求參數(shù),可以添加普通的字符串參數(shù),并可添加File,InputStream上傳文件

AsyncHttpClient類:核心類,使用HttpClient執(zhí)行網(wǎng)絡(luò)請求,提供了get,put,post,delete,head等請求方法,使用起來很簡單,只需以url及RequestParams調(diào)用相應(yīng)的方法即可,還可以選擇性地傳入Context,用于取消Content相關(guān)的請求,同時(shí)必須提供ResponseHandlerInterface(AsyncHttpResponseHandler繼承自ResponseHandlerInterface)的實(shí)現(xiàn)類,一般為AsyncHttpResponseHandler的子類,AsyncHttpClient內(nèi)部有一個(gè)線程池,當(dāng)使用AsyncHttpClient執(zhí)行網(wǎng)絡(luò)請求時(shí),最終都會(huì)調(diào)用sendRequest方法,在這個(gè)方法內(nèi)部將請求參數(shù)封裝成AsyncHttpRequest(繼承自Runnable)交由內(nèi)部的線程池執(zhí)行

SyncHttpClient類:繼承自AsyncHttpClient,同步執(zhí)行網(wǎng)絡(luò)請求,AsyncHttpClient把請求封裝成AsyncHttpRequest后提交至線程池,SyncHttpClient把請求封裝成AsyncHttpRequest后直接調(diào)用它的run方法

這里就不介紹里面的方法了,具體的可以去Github看一下源碼:https://github.com/loopj/android-async-http

或者可以看一下API:https://loopj.com/android-async-http/doc/

再簡單介紹一下Asynchttpclient框架的請求流程:

首先調(diào)用AsyncHttpClient的get或post等方法發(fā)起網(wǎng)絡(luò)請求

所有的請求都走了sendRequest,在sendRequest中把請求封裝為了AsyncHttpRequest,并添加到線程池執(zhí)行

當(dāng)請求被執(zhí)行時(shí)(即AsyncHttpRequest的run方法),執(zhí)行AsyncHttpRequest的makeRequestWithRetries方法執(zhí)行實(shí)際的請求,當(dāng)請求失敗時(shí)可以重試。并在請求開始,結(jié)束,成功或失敗時(shí)向請求時(shí)傳的ResponseHandlerInterface實(shí)例發(fā)送消息

基本上使用的都是AsyncHttpResponseHandler的子類,調(diào)用其onStart,onSuccess等方法返回請求結(jié)果

關(guān)于Asynchttpclient就簡單介紹到這里,下面介紹一下Asynchttpclient的具體使用

使用

Asynchttpclient框架的使用步驟基本是:

創(chuàng)建一個(gè)AsyncHttpClient對象

通過RequestParams對象設(shè)置請求參數(shù),這個(gè)是可選擇的

調(diào)用AsyncHttpClient對象里面的方法,實(shí)現(xiàn)請求或者上傳數(shù)據(jù)。這里需要實(shí)現(xiàn)內(nèi)部類回調(diào),框架自己有實(shí)現(xiàn)有,不需要我們自己手動(dòng)實(shí)現(xiàn),我們只需要調(diào)用即可。

如果是在Android Studio中使用,需要在gradle中添加:

compile "com.loopj.android:android-async-http:1.4.9"

如果是Eclipse的話需要去GitHub或者官網(wǎng)下載相應(yīng)版本的JAR吧,GitHub地址在上文中有給出,下面是Asynchttpclient的官網(wǎng):http://loopj.com/android-async-http/

下面看一下具體的代碼:

AsyncHttpClient client = new AsyncHttpClient();
client.get("https://www.google.com", new AsyncHttpResponseHandler() {

       @Override
       public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
            // called when request is retried
    }
    });

這里是Get請求的寫法,官方推薦我們使用靜態(tài)的寫法:

import com.loopj.android.http.*;

public class TwitterRestClient {
  private static final String BASE_URL = "https://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;
  }
}

這樣方便我們使用。

下面我們使用這個(gè)框架實(shí)現(xiàn)GET請求、POST請求、文件上傳、文件下載這四個(gè)功能,這里沒有實(shí)現(xiàn)保存Cookie的功能,有需要的可以擴(kuò)展實(shí)現(xiàn):

實(shí)現(xiàn)GET請求

我們先看一下具體實(shí)現(xiàn)的代碼:

AsyncHttpUtils.get(UrlUtils.REQUEST_URL + UrlUtils.URL_KEY, null, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            super.onSuccess(statusCode, headers, response);
            Log.i(TAG, getResources().getString(R.string.req_success));
            Log.i(TAG, "======================================================================");
            Log.i(TAG, response.toString());
            Log.i(TAG, "======================================================================");
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
            super.onFailure(statusCode, headers, throwable, errorResponse);
            Log.i(TAG, getResources().getString(R.string.req_failed));
        }
    });

這樣就可以實(shí)現(xiàn)一個(gè)GET請求,請求是在非UI線程中,有請求成功的回調(diào)和請求失敗的回調(diào),我們更新UI需要通過發(fā)消息或者其它方式實(shí)現(xiàn),不能再請求成功的回調(diào)方法里面直接更新UI。其中RequestParams是可以選擇的,沒有請求參數(shù)可以直接設(shè)置為null。非常簡單,就不在做過多的介紹了。

實(shí)現(xiàn)POST請求

我們還是先看一下具體的代碼:

 RequestParams requestParams = new RequestParams();
    requestParams.put("username", "Devin");
    requestParams.put("password", "Devin");
    AsyncHttpUtils.post(UrlUtils.POST_URL, requestParams, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            Log.i(TAG, getResources().getString(R.string.req_success));
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Log.i(TAG, getResources().getString(R.string.req_failed));
        }
    });

POST請求需要上傳一些參數(shù),框架提供了設(shè)置參數(shù)的類RequestParams,其中,RequestParams類似于Map,是鍵值對的形式,添加請求參數(shù)有三種方式:

第一種就是像我上面代碼一樣,創(chuàng)建一個(gè)空的RequestParams對象,然后通過put方法將參數(shù)寫入;

第二種則是創(chuàng)建的時(shí)候就直接添加,例如:

RequestParams params = new RequestParams("single", "value");

第三種是將參數(shù)寫入一個(gè)Map中,然后將Map賦給RequestParams,例如:

HashMap paramMap = new HashMap();
paramMap.put("key", "value");
RequestParams params = new RequestParams(paramMap);

這三種方式無論哪一種都可以實(shí)現(xiàn)封裝請求參數(shù)。

實(shí)現(xiàn)文件上傳

使用Asynchttpclient實(shí)現(xiàn)文件上傳也非常簡單,我們先看一下代碼:

 RequestParams requestParams = new RequestParams();
    File file = new File("/sdcard/okhttp-3.4.1.jar");
    try {
        requestParams.put("file", file);
        AsyncHttpUtils.post(UrlUtils.UPLOAD_URL, requestParams, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                Log.i(TAG, getResources().getString(R.string.req_success));
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Log.i(TAG, getResources().getString(R.string.req_failed));
            }
        });
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

可以看到,這里文件上傳是將文件封裝到RequestParams中的,Asynchttpclient框架提供的封裝文件到RequestParams中有三種方法,分別是:

第一種是將文件轉(zhuǎn)成流的形式封裝到RequestParams中,例如:

InputStream myInputStream = blah;
RequestParams params = new RequestParams();
params.put("secret_passwords", myInputStream, "passwords.txt");

第二種就是像上面的代碼一樣,將文件直接封裝到RequestParams中

第三種是將文件轉(zhuǎn)成二進(jìn)制數(shù)組的形式,例如:

byte[] myByteArray = blah;
RequestParams params = new RequestParams();
params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");

這三種方法無論哪一種都可以實(shí)現(xiàn)封裝文件到RequestParams中,然后調(diào)用AsyncHttpClient對象中的方法實(shí)現(xiàn)上傳,具體使用哪一種看個(gè)人喜歡了。

實(shí)現(xiàn)文件下載

使用Asynchttpclient框架實(shí)現(xiàn)文件下載也非常簡單,我們先看一下代碼:

 AsyncHttpUtils.download(UrlUtils.DOWNLOAD_URL, null, new FileAsyncHttpResponseHandler(getActivity()) {
        @Override
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {
            Log.i(TAG, getResources().getString(R.string.req_failed));
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, File file) {
            Log.i(TAG, getResources().getString(R.string.req_success));
        }
    });

實(shí)現(xiàn)文件下載,回調(diào)選擇的就是FileAsyncHttpResponseHandler這個(gè)Asynchttpclient框架提供的類,這可以非常方便的實(shí)現(xiàn)文件的下載。

關(guān)于Asynchttpclient框架就簡單介紹到這里了,還有保存Cookie這個(gè)功能沒有實(shí)現(xiàn),不過實(shí)現(xiàn)也非常簡單,不懂得可以看一下官方的文檔,官網(wǎng)地址上文中有給出了。

文中Demo已經(jīng)上傳到GitHub中,有興趣的可以去了解一下:https://github.com/Devin1102/AndroidFrameDemo

最后,歡迎留言交流學(xué)習(xí)!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65163.html

相關(guān)文章

  • APT案例之點(diǎn)擊事件

    摘要:楊充一定時(shí)間內(nèi)該點(diǎn)擊事件只能執(zhí)行一次用來修飾這是一個(gè)什么類型的注解。楊充自定義編譯器獲取遍歷,并生成代碼配置文件文件配置的作用是向系統(tǒng)注冊自定義注解處理器,執(zhí)行編譯時(shí)使用進(jìn)行處理。 目錄介紹 01.創(chuàng)建項(xiàng)目步驟 1.1 項(xiàng)目搭建 1.2 項(xiàng)目功能 02.自定義注解 03.創(chuàng)建Processor 04.compiler配置文件 05.編譯jar 06.如何使用 07.編譯生成代...

    cyixlq 評論0 收藏0
  • 04.Android之動(dòng)畫問題

    摘要:動(dòng)畫占用大量內(nèi)存,如何優(yōu)化使用動(dòng)畫的注意事項(xiàng)有哪些問題這個(gè)問題主要出現(xiàn)在幀動(dòng)畫中,當(dāng)圖片數(shù)量較多且圖片較大時(shí)就極易出現(xiàn),這個(gè)在實(shí)際開發(fā)中要尤其注意,盡量避免使用幀動(dòng)畫。 目錄介紹 4.0.0.1 Android中有哪幾種類型的動(dòng)畫,屬性動(dòng)畫和補(bǔ)間動(dòng)畫有何區(qū)別?補(bǔ)間動(dòng)畫和屬性動(dòng)畫常用的有哪些? 4.0.0.2 View動(dòng)畫為何不能真正改變View的位置?而屬性動(dòng)畫為何可以?屬性動(dòng)畫是如...

    Muninn 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<