摘要:上一篇中我們介紹了框架的基本使用方法,這一篇我們學習一下的另外一個網絡請求框架框架。這里需要實現內部類回調,框架自己有實現有,不需要我們自己手動實現,我們只需要調用即可。其中是可以選擇的,沒有請求參數可以直接設置為。
上一篇中我們介紹了OkHttp3.0框架的基本使用方法,這一篇我們學習一下Android的另外一個網絡請求框架——AsyncHttpClient框架。Asynchttpclient框架是一個開源的異步網絡請求框架,所有的網絡都在Android的非UI線程中,通過回調方法處理請求結果,無論是向網絡請求數據還是上傳數據都非常方便,而且這個框架非常體積非常小,只有90K左右的大小,我們可以輕松使用它,下面我們介紹一下這個框架:
概述Asynchttpclient框架有如下的特征:
處理異步Http請求,并通過匿名內部類處理回調結果
Http異步請求均位于非UI線程,不會阻塞UI操作
通過線程池處理并發請求處理文件上傳、下載,響應結果自動打包JSON格式
自動處理連接斷開時請求重連
永久的cookie保存,內部實現用的是Android的SharedPreferences
通過BaseJsonHttpResponseHandler和各種json庫集成
支持SAX解析器
支持各種語言和content編碼,不僅僅是UTF-8
自動的gzip響應解碼
內置多種形式的響應解析,有原生的字節流,string,json對象,甚至可以將response寫到文件中
這里只是簡單的介紹一下,具體需要實現細節需要我們在開發中實際去體會。
我們來學習一下Asynchttpclient里面的具體的類:
AsyncHttpRequest類:繼承自Runnabler,被submit至線程池執行網絡請求并發送start,success等消息
AsyncHttpResponseHandler類:接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息
TextHttpResponseHandler類:繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數組轉換為String
JsonHttpResponseHandler類:繼承自TextHttpResponseHandler,同樣是重寫onSuccess和onFailure方法,將請求結果由String轉換為JSONObject或JSONArray
BaseJsonHttpResponseHandler類:繼承自TextHttpResponseHandler,是一個泛型類,提供了parseResponse方法,子類需要提供實現,將請求結果解析成需要的類型,子類可以靈活地使用解析方法,可以直接原始解析,使用gson等
RequestParams類:請求參數,可以添加普通的字符串參數,并可添加File,InputStream上傳文件
AsyncHttpClient類:核心類,使用HttpClient執行網絡請求,提供了get,put,post,delete,head等請求方法,使用起來很簡單,只需以url及RequestParams調用相應的方法即可,還可以選擇性地傳入Context,用于取消Content相關的請求,同時必須提供ResponseHandlerInterface(AsyncHttpResponseHandler繼承自ResponseHandlerInterface)的實現類,一般為AsyncHttpResponseHandler的子類,AsyncHttpClient內部有一個線程池,當使用AsyncHttpClient執行網絡請求時,最終都會調用sendRequest方法,在這個方法內部將請求參數封裝成AsyncHttpRequest(繼承自Runnable)交由內部的線程池執行
SyncHttpClient類:繼承自AsyncHttpClient,同步執行網絡請求,AsyncHttpClient把請求封裝成AsyncHttpRequest后提交至線程池,SyncHttpClient把請求封裝成AsyncHttpRequest后直接調用它的run方法
這里就不介紹里面的方法了,具體的可以去Github看一下源碼:https://github.com/loopj/android-async-http
或者可以看一下API:https://loopj.com/android-async-http/doc/
再簡單介紹一下Asynchttpclient框架的請求流程:
首先調用AsyncHttpClient的get或post等方法發起網絡請求
所有的請求都走了sendRequest,在sendRequest中把請求封裝為了AsyncHttpRequest,并添加到線程池執行
當請求被執行時(即AsyncHttpRequest的run方法),執行AsyncHttpRequest的makeRequestWithRetries方法執行實際的請求,當請求失敗時可以重試。并在請求開始,結束,成功或失敗時向請求時傳的ResponseHandlerInterface實例發送消息
基本上使用的都是AsyncHttpResponseHandler的子類,調用其onStart,onSuccess等方法返回請求結果
關于Asynchttpclient就簡單介紹到這里,下面介紹一下Asynchttpclient的具體使用
使用Asynchttpclient框架的使用步驟基本是:
創建一個AsyncHttpClient對象
通過RequestParams對象設置請求參數,這個是可選擇的
調用AsyncHttpClient對象里面的方法,實現請求或者上傳數據。這里需要實現內部類回調,框架自己有實現有,不需要我們自己手動實現,我們只需要調用即可。
如果是在Android Studio中使用,需要在gradle中添加:
compile "com.loopj.android:android-async-http:1.4.9"
如果是Eclipse的話需要去GitHub或者官網下載相應版本的JAR吧,GitHub地址在上文中有給出,下面是Asynchttpclient的官網: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請求的寫法,官方推薦我們使用靜態的寫法:
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; } }
這樣方便我們使用。
下面我們使用這個框架實現GET請求、POST請求、文件上傳、文件下載這四個功能,這里沒有實現保存Cookie的功能,有需要的可以擴展實現:
實現GET請求我們先看一下具體實現的代碼:
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)); } });
這樣就可以實現一個GET請求,請求是在非UI線程中,有請求成功的回調和請求失敗的回調,我們更新UI需要通過發消息或者其它方式實現,不能再請求成功的回調方法里面直接更新UI。其中RequestParams是可以選擇的,沒有請求參數可以直接設置為null。非常簡單,就不在做過多的介紹了。
實現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請求需要上傳一些參數,框架提供了設置參數的類RequestParams,其中,RequestParams類似于Map,是鍵值對的形式,添加請求參數有三種方式:
第一種就是像我上面代碼一樣,創建一個空的RequestParams對象,然后通過put方法將參數寫入;
第二種則是創建的時候就直接添加,例如:
RequestParams params = new RequestParams("single", "value");
第三種是將參數寫入一個Map中,然后將Map賦給RequestParams,例如:
HashMapparamMap = new HashMap (); paramMap.put("key", "value"); RequestParams params = new RequestParams(paramMap);
這三種方式無論哪一種都可以實現封裝請求參數。
實現文件上傳使用Asynchttpclient實現文件上傳也非常簡單,我們先看一下代碼:
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中有三種方法,分別是:
第一種是將文件轉成流的形式封裝到RequestParams中,例如:
InputStream myInputStream = blah; RequestParams params = new RequestParams(); params.put("secret_passwords", myInputStream, "passwords.txt");
第二種就是像上面的代碼一樣,將文件直接封裝到RequestParams中
第三種是將文件轉成二進制數組的形式,例如:
byte[] myByteArray = blah; RequestParams params = new RequestParams(); params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");
這三種方法無論哪一種都可以實現封裝文件到RequestParams中,然后調用AsyncHttpClient對象中的方法實現上傳,具體使用哪一種看個人喜歡了。
實現文件下載使用Asynchttpclient框架實現文件下載也非常簡單,我們先看一下代碼:
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)); } });
實現文件下載,回調選擇的就是FileAsyncHttpResponseHandler這個Asynchttpclient框架提供的類,這可以非常方便的實現文件的下載。
關于Asynchttpclient框架就簡單介紹到這里了,還有保存Cookie這個功能沒有實現,不過實現也非常簡單,不懂得可以看一下官方的文檔,官網地址上文中有給出了。
文中Demo已經上傳到GitHub中,有興趣的可以去了解一下:https://github.com/Devin1102/AndroidFrameDemo
最后,歡迎留言交流學習!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65163.html
摘要:楊充一定時間內該點擊事件只能執行一次用來修飾這是一個什么類型的注解。楊充自定義編譯器獲取遍歷,并生成代碼配置文件文件配置的作用是向系統注冊自定義注解處理器,執行編譯時使用進行處理。 目錄介紹 01.創建項目步驟 1.1 項目搭建 1.2 項目功能 02.自定義注解 03.創建Processor 04.compiler配置文件 05.編譯jar 06.如何使用 07.編譯生成代...
摘要:動畫占用大量內存,如何優化使用動畫的注意事項有哪些問題這個問題主要出現在幀動畫中,當圖片數量較多且圖片較大時就極易出現,這個在實際開發中要尤其注意,盡量避免使用幀動畫。 目錄介紹 4.0.0.1 Android中有哪幾種類型的動畫,屬性動畫和補間動畫有何區別?補間動畫和屬性動畫常用的有哪些? 4.0.0.2 View動畫為何不能真正改變View的位置?而屬性動畫為何可以?屬性動畫是如...
閱讀 3234·2021-11-18 10:02
閱讀 1936·2021-09-22 10:54
閱讀 2989·2019-08-30 15:43
閱讀 2576·2019-08-30 13:22
閱讀 1575·2019-08-29 13:57
閱讀 1041·2019-08-29 13:27
閱讀 731·2019-08-26 14:05
閱讀 2512·2019-08-26 13:30