摘要:上一篇中我們介紹了框架的基本使用方法,這一篇我們學(xué)習(xí)一下的另外一個網(wǎng)絡(luò)請求框架框架。這里需要實現(xiàn)內(nèi)部類回調(diào),框架自己有實現(xiàn)有,不需要我們自己手動實現(xiàn),我們只需要調(diào)用即可。其中是可以選擇的,沒有請求參數(shù)可以直接設(shè)置為。
上一篇中我們介紹了OkHttp3.0框架的基本使用方法,這一篇我們學(xué)習(xí)一下Android的另外一個網(wǎng)絡(luò)請求框架——AsyncHttpClient框架。Asynchttpclient框架是一個開源的異步網(wǎng)絡(luò)請求框架,所有的網(wǎng)絡(luò)都在Android的非UI線程中,通過回調(diào)方法處理請求結(jié)果,無論是向網(wǎng)絡(luò)請求數(shù)據(jù)還是上傳數(shù)據(jù)都非常方便,而且這個框架非常體積非常小,只有90K左右的大小,我們可以輕松使用它,下面我們介紹一下這個框架:
概述Asynchttpclient框架有如下的特征:
處理異步Http請求,并通過匿名內(nèi)部類處理回調(diào)結(jié)果
Http異步請求均位于非UI線程,不會阻塞UI操作
通過線程池處理并發(fā)請求處理文件上傳、下載,響應(yīng)結(jié)果自動打包JSON格式
自動處理連接斷開時請求重連
永久的cookie保存,內(nèi)部實現(xiàn)用的是Android的SharedPreferences
通過BaseJsonHttpResponseHandler和各種json庫集成
支持SAX解析器
支持各種語言和content編碼,不僅僅是UTF-8
自動的gzip響應(yīng)解碼
內(nèi)置多種形式的響應(yīng)解析,有原生的字節(jié)流,string,json對象,甚至可以將response寫到文件中
這里只是簡單的介紹一下,具體需要實現(xiàn)細(xì)節(jié)需要我們在開發(fā)中實際去體會。
我們來學(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,是一個泛型類,提供了parseResponse方法,子類需要提供實現(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)的請求,同時必須提供ResponseHandlerInterface(AsyncHttpResponseHandler繼承自ResponseHandlerInterface)的實現(xiàn)類,一般為AsyncHttpResponseHandler的子類,AsyncHttpClient內(nèi)部有一個線程池,當(dāng)使用AsyncHttpClient執(zhí)行網(wǎng)絡(luò)請求時,最終都會調(diào)用sendRequest方法,在這個方法內(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í)行時(即AsyncHttpRequest的run方法),執(zhí)行AsyncHttpRequest的makeRequestWithRetries方法執(zhí)行實際的請求,當(dāng)請求失敗時可以重試。并在請求開始,結(jié)束,成功或失敗時向請求時傳的ResponseHandlerInterface實例發(fā)送消息
基本上使用的都是AsyncHttpResponseHandler的子類,調(diào)用其onStart,onSuccess等方法返回請求結(jié)果
關(guān)于Asynchttpclient就簡單介紹到這里,下面介紹一下Asynchttpclient的具體使用
使用Asynchttpclient框架的使用步驟基本是:
創(chuàng)建一個AsyncHttpClient對象
通過RequestParams對象設(shè)置請求參數(shù),這個是可選擇的
調(diào)用AsyncHttpClient對象里面的方法,實現(xiàn)請求或者上傳數(shù)據(jù)。這里需要實現(xiàn)內(nèi)部類回調(diào),框架自己有實現(xiàn)有,不需要我們自己手動實現(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; } }
這樣方便我們使用。
下面我們使用這個框架實現(xiàn)GET請求、POST請求、文件上傳、文件下載這四個功能,這里沒有實現(xiàn)保存Cookie的功能,有需要的可以擴(kuò)展實現(xiàn):
實現(xiàn)GET請求我們先看一下具體實現(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)); } });
這樣就可以實現(xiàn)一個GET請求,請求是在非UI線程中,有請求成功的回調(diào)和請求失敗的回調(diào),我們更新UI需要通過發(fā)消息或者其它方式實現(xiàn),不能再請求成功的回調(diào)方法里面直接更新UI。其中RequestParams是可以選擇的,沒有請求參數(shù)可以直接設(shè)置為null。非常簡單,就不在做過多的介紹了。
實現(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)建一個空的RequestParams對象,然后通過put方法將參數(shù)寫入;
第二種則是創(chuàng)建的時候就直接添加,例如:
RequestParams params = new RequestParams("single", "value");
第三種是將參數(shù)寫入一個Map中,然后將Map賦給RequestParams,例如:
HashMapparamMap = new HashMap (); paramMap.put("key", "value"); RequestParams params = new RequestParams(paramMap);
這三種方式無論哪一種都可以實現(xiàn)封裝請求參數(shù)。
實現(xiàn)文件上傳使用Asynchttpclient實現(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");
這三種方法無論哪一種都可以實現(xiàn)封裝文件到RequestParams中,然后調(diào)用AsyncHttpClient對象中的方法實現(xiàn)上傳,具體使用哪一種看個人喜歡了。
實現(xiàn)文件下載使用Asynchttpclient框架實現(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)); } });
實現(xiàn)文件下載,回調(diào)選擇的就是FileAsyncHttpResponseHandler這個Asynchttpclient框架提供的類,這可以非常方便的實現(xiàn)文件的下載。
關(guān)于Asynchttpclient框架就簡單介紹到這里了,還有保存Cookie這個功能沒有實現(xiàn),不過實現(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://systransis.cn/yun/65163.html
摘要:楊充一定時間內(nèi)該點擊事件只能執(zhí)行一次用來修飾這是一個什么類型的注解。楊充自定義編譯器獲取遍歷,并生成代碼配置文件文件配置的作用是向系統(tǒng)注冊自定義注解處理器,執(zhí)行編譯時使用進(jìn)行處理。 目錄介紹 01.創(chuàng)建項目步驟 1.1 項目搭建 1.2 項目功能 02.自定義注解 03.創(chuàng)建Processor 04.compiler配置文件 05.編譯jar 06.如何使用 07.編譯生成代...
摘要:動畫占用大量內(nèi)存,如何優(yōu)化使用動畫的注意事項有哪些問題這個問題主要出現(xiàn)在幀動畫中,當(dāng)圖片數(shù)量較多且圖片較大時就極易出現(xiàn),這個在實際開發(fā)中要尤其注意,盡量避免使用幀動畫。 目錄介紹 4.0.0.1 Android中有哪幾種類型的動畫,屬性動畫和補(bǔ)間動畫有何區(qū)別?補(bǔ)間動畫和屬性動畫常用的有哪些? 4.0.0.2 View動畫為何不能真正改變View的位置?而屬性動畫為何可以?屬性動畫是如...
閱讀 3261·2021-11-18 10:02
閱讀 1960·2021-09-22 10:54
閱讀 2999·2019-08-30 15:43
閱讀 2590·2019-08-30 13:22
閱讀 1587·2019-08-29 13:57
閱讀 1057·2019-08-29 13:27
閱讀 750·2019-08-26 14:05
閱讀 2536·2019-08-26 13:30