<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      快速Android開發系列網絡篇之Android-Async-Http

      先來看一下最基本的用法

      AsyncHttpClient client = new AsyncHttpClient();
      client.get("http://www.google.com", new AsyncHttpResponseHandler() {
          @Override
          public void onSuccess(String response) {
              System.out.println(response);
          }
      });

      通過AsyncHttpClient類的實例就可以執行網絡請求,包括get、put、post、head、delete。并指定一個ResponseHandlerInterface的實例接收請求結果。(onSuccess參數不對,此處只說明基本用法,詳細參數看源碼)

      主要類介紹

      • 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方法。

      請求流程

      1. 調用AsyncHttpClient的get或post等方法發起網絡請求
      2. 所有的請求都走了sendRequest,在sendRequest中把請求封裝為了AsyncHttpRequest,并添加到線程池執行
      3. 當請求被執行時(即AsyncHttpRequest的run方法),執行AsyncHttpRequest的makeRequestWithRetries方法執行實際的請求,當請求失敗時可以重試。并在請求開始,結束,成功或失敗時向請求時傳的ResponseHandlerInterface實例發送消息
      4. 基本上使用的都是AsyncHttpResponseHandler的子類,調用其onStart,onSuccess等方法返回請求結果

      詳細使用方法

      官方建議使用一個靜態的AsyncHttpClient,像下面的這樣:

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

      封裝的方法建議都加上Context參數,以在Activity pause或stop時取消掉沒用的請求。

      詳細使用方法就不說了,直接看官方文檔

      其他說明及總結

      Android-Async-Http的使用非常簡單,通過AsyncHttpClient發起請求就可以了,如果需要添加參數,直接傳一個RequestParams過去,而且參數可以是String、File和InputStream,可以很方便地上傳文件。

      每個請求都需要傳一個ResponseHandlerInterface的實例用以接收請求結果或請求失敗,請求結束等通知,一般是AsyncHttpResponseHandler的子類。

      通過BinaryHttpResponseHandler可以發起二進制請求,如請求圖片。

      通過TextHttpResponseHandler可以發起返回結果為字符串的請求,一般這個使用較多。

      也可以使用它的子類JsonHttpResponseHandler,返回結果是一個JSONObject或JSONArray。不過感覺這個類作用不大,一是有另一個類BaseJsonHttpResponseHandler,可以直接解析返回的JSON數據,二是JsonHttpResponseHandler的方法太復雜了,有太多的onSuccess和onFailure方法,都不知道重寫哪個了。

      如上圖所示,每個子類有太多的onSuccess和onFailure了,尤其是JsonHttpResponseHandler,這應該算是這個類庫的不足吧。所以平時使用時基本不使用JsonHttpResponseHandler,而是直接使用TextHttpResponseHandler,當然也可以使用BaseJsonHttpResponseHandler。

      這個類庫還有一點不足,就是onSuccess等方法一般會在主線程執行,其實這么說不嚴謹,看代碼吧:

      public AsyncHttpResponseHandler() {
          boolean missingLooper = null == Looper.myLooper();
          // Try to create handler
          if (!missingLooper)
              handler = new ResponderHandler(this);
          else {
              // There is no Looper on this thread so synchronous mode should be used.
              handler = null;
              setUseSynchronousMode(true);
              Log.i(LOG_TAG, "Current thread has not called Looper.prepare(). Forcing synchronous mode.");
          }
          // Init Looper by calling postRunnable without an argument.
          postRunnable(null);
      }

      可以看到,內部使用了Handler,當新建AsyncHttpResponseHandler的實例的時候會獲取當前線程的Looper,如果為空就啟用同步模式,即所有的回調都會在執行請求的線程中執行,當在一個普通的后臺線程時這樣執行是正常的,而我們一般都會在主線程發請請求,結果就是所有的回調都會在主線程中執行,這就限制了我們在onSuccess中執行耗時操作,比如請求成功后將數據持久化到數據庫。

      不過可以看到創建Handler的時候使用了Looper對象,所以我們就可以改進一下其構造函數,添加一個Looper參數(同步修改子類),這樣所有的回調就都會在Looper所在線程執行,這樣我們只需要開啟一個HandlerThread就行了。但這樣和Looper為空時一樣有一個弊端,如果要更新UI操作的話,還需要向一個主線程的Handler發送消息讓UI更新。還有第二個弊端,所有回調都在同一個HandlerThread中執行,如果一個處理耗時太久會阻塞后面的請求結果處理,如果只是簡單地寫個數據庫影響應該不大,如果真耗時太久,為這個耗時處理再開個線程吧。

       

      posted @ 2014-05-16 13:11  AngelDevil  閱讀(106775)  評論(3)    收藏  舉報
      主站蜘蛛池模板: 人人做人人爽人人爱| 久久国产精品福利一区二区三区| 337p日本欧洲亚洲大胆色噜噜| 大屁股国产白浆一二区| 东京热大乱系列无码| 成人无码视频| 中文字幕国产精品第一页| 国产av剧情md精品麻豆| 亚洲中文字幕无码爆乳app| 麻豆一区二区三区精品视频| www插插插无码免费视频网站| 中国亚州女人69内射少妇| 亚洲国产精品老熟女乱码| 中文精品无码中文字幕无码专区 | 亚洲伊人五月丁香激情| 人人妻人人狠人人爽天天综合网| 欧美日韩精品一区二区在线观看| 亚洲夂夂婷婷色拍ww47| 伊人成伊人成综合网222| 亚洲国产片一区二区三区| 无套后入极品美女少妇| 亚洲热视频这里只有精品| 国产一区二区三区av在线无码观看| 欧美人与zoxxxx另类| 国产真人无遮挡免费视频| 国产午夜A理论毛片| 久青草视频在线视频在线| 久久天天躁狠狠躁夜夜婷| 97久久超碰亚洲视觉盛宴| 日韩有码中文字幕av| 99久久婷婷国产综合精品青草漫画| 达孜县| 国产黄色精品一区二区三区| 亚洲成在人线在线播放无码| 少妇办公室好紧好爽再浪一点| 国产免费午夜福利蜜芽无码| 亚洲成aⅴ人在线观看| 99热门精品一区二区三区无码| 成人免费AV一区二区三区| a4yy私人毛片| 国产色无码专区在线观看|