最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Android的OkHttp包編寫異步HTTP請求調(diào)用的方法

 更新時間:2016年07月13日 11:48:52   作者:bng86  
OkHttp支持Callback異步回調(diào)來實現(xiàn)線程的非阻塞,下面我們就來詳解Android的OkHttp包編寫異步HTTP請求調(diào)用的方法,需要的朋友可以參考下

OkHttp 除了支持常用的同步 HTTP 請求之外,還支持異步 HTTP 請求調(diào)用。在使用同步調(diào)用時,當(dāng)前線程會被阻塞,直到 HTTP 請求完成。當(dāng)同時發(fā)出多個 HTTP 請求時,同步調(diào)用的性能會比較差。這個時候通過異步調(diào)用可以提高整體的性能。
在通過 newCall 方法創(chuàng)建一個新的 Call 對象之后,不是通過 execute 方法來同步執(zhí)行,而是通過 enqueue 方法來添加到執(zhí)行隊列中。在調(diào)用 enqueue 方法時需要提供一個 Callback 接口的實現(xiàn)。在 Callback 接口實現(xiàn)中,通過 onResponse 和 onFailure 方法來處理響應(yīng)和進行錯誤處理。
異步調(diào)用的示例

public class AsyncGet {
  public static void main(String[] args) throws IOException {
  OkHttpClient client = new OkHttpClient();

  Request request = new Request.Builder()
      .url("http://www.baidu.com")
      .build();

  client.newCall(request).enqueue(new Callback() {
    public void onFailure(Request request, IOException e) {
      e.printStackTrace();
    }

    public void onResponse(Response response) throws IOException {
      if (!response.isSuccessful()) {
        throw new IOException("服務(wù)器端錯誤: " + response);
      }

      System.out.println(response.body().string());
    }
});
  }
}

覺得okHttp最難寫的地方應(yīng)該就是Callback了。
相信很多人都會遇到,如果Callback回來之后,我的Activity finish了,或是我的Fragment replace了。
此時更改UI,就會產(chǎn)生找不到View的問題。
而且Callback回來,居然是在backgroundThread上,
這時候如果要操作View又要切換到mainThread去,略顯麻煩。
所以我在寫的時候,是沒有使用Callback的 以下提供一種漂亮(自認(rèn)...)的寫法給大家做參考。

/* 以fragment為例 */

public class BaseFragment extends Fragment implements Handler.Callback {

private static final int MSG_QUERY_DATA = 0x00;
private static final int MSG_DISPLAY_DATA = 0x01;

@Override
public void onAttach(Activity activity) {
  super.onAttach(activity);
  this.activity = activity;

  /* setup handler */
  HandlerThread handlerThread = new HandlerThread(getClass().getName());
  handlerThread.start();
  backgroundHandler = new Handler(handlerThread.getLooper(), this);
  uiHandler = new Handler(activity.getMainLooper(), this);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

  /* start */
  backgroundHandler.sendEmptyMessage(MSG_QUERY_DATA);
}

@Override
public void onDestroyView() {

  /* 將Message清空,backgroundThread結(jié)束掉 */
  backgroundHandler.removeCallbacksAndMessages(null);
  uiHandler.removeCallbacksAndMessages(null);
  backgroundHandler.getLooper().quit();
  super.onDestroyView();
}

@Override
public boolean handleMessage(Message msg) {

  /* 如果fragment不在Activity上了,直接return掉,避免NPE */
  if (!isAdded()) return false;

  /* 做各種MSG */
  switch(msg.what){

    case MSG_QUERY_DATA:

      // do okHttp without callback
      Response response = client.newCall(request).execute();

      // 傳回 uiThread 做UI更新
      Message respMsg = uiHandler.obtainMessage();
      respMsg.what = MSG_DISPLAY_DATA;
      respMsg.obj = response;
      backgroundHandler.sendMessage(respMsg);
      break;

    case MSG_DISPLAY_DATA:

      Response apiResponse = (Response)msg.obj;

      // 失敗
      if(null == apiResponse){
        //show error
      }

      // 成功
      else{
        //display data on UI
      }

      break;

    return false;
  }
}

相關(guān)文章

  • android實現(xiàn)可自由移動、監(jiān)聽點擊事件的懸浮窗

    android實現(xiàn)可自由移動、監(jiān)聽點擊事件的懸浮窗

    這篇文章主要為大家詳細介紹了android實現(xiàn)可自由移動、監(jiān)聽點擊事件的懸浮窗,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android如何監(jiān)測文件夾內(nèi)容變化詳解

    Android如何監(jiān)測文件夾內(nèi)容變化詳解

    最近在開發(fā)android應(yīng)用程序的時候遇到了一個監(jiān)測文件夾的功能,所以下面這篇文章主要給大家介紹了關(guān)于Android如何監(jiān)測文件夾內(nèi)容變化的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Android自定義View設(shè)定到FrameLayout布局中實現(xiàn)多組件顯示的方法 分享

    Android自定義View設(shè)定到FrameLayout布局中實現(xiàn)多組件顯示的方法 分享

    Android自定義View設(shè)定到FrameLayout布局中實現(xiàn)多組件顯示的方法 分享,需要的朋友可以參考一下
    2013-05-05
  • Android Studio 3.0的下載安裝教程

    Android Studio 3.0的下載安裝教程

    Android Studio從3.0版本新增了許多功能,當(dāng)然首當(dāng)其沖就是從3.0版本新增了對 Kotlin 開發(fā)語言的支持,除此之外還有其他一些新功能,今天我們主要來看看如何更新Android Studio 3.0
    2017-10-10
  • Android Java調(diào)用自己C++類庫的實例講解

    Android Java調(diào)用自己C++類庫的實例講解

    今天小編就為大家分享一篇關(guān)于Android Java調(diào)用自己C++類庫的實例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Android模仿微信收藏文件的標(biāo)簽處理功能

    Android模仿微信收藏文件的標(biāo)簽處理功能

    這篇文章主要介紹了android模仿微信收藏文件的標(biāo)簽處理功能的相關(guān)資料,也可以刪除已編輯菜單,需要的朋友可以參考下
    2016-11-11
  • Android仿微信錄音功能

    Android仿微信錄音功能

    這篇文章主要為大家詳細介紹了Android仿微信錄音功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 老生常談ProgressBar、ProgessDialog的用法

    老生常談ProgressBar、ProgessDialog的用法

    下面小編就為大家?guī)硪黄仙U凱rogressBar、ProgessDialog的用法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • ObjectAnimator屬性動畫源碼分析篇

    ObjectAnimator屬性動畫源碼分析篇

    今天小編就為大家分享一篇關(guān)于ObjectAnimator屬性動畫源碼分析篇,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • android實現(xiàn)直播點贊飄心動畫效果

    android實現(xiàn)直播點贊飄心動畫效果

    這篇文章主要為大家詳細介紹了android實現(xiàn)直播點贊飄心動畫效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

苍南县| 宿迁市| 宾川县| 泰兴市| 馆陶县| 象州县| 广德县| 郸城县| 南昌县| 双峰县| 九江市| 延吉市| 宿州市| 罗城| 布尔津县| 开化县| 当涂县| 枣强县| 咸阳市| 象州县| 嘉定区| 英超| 中江县| 昌乐县| 临沭县| 嘉义县| 那曲县| 台州市| 吴旗县| 临夏县| 嘉善县| 镇原县| 德惠市| 醴陵市| 上蔡县| 深水埗区| 阿荣旗| 济源市| 贵南县| 高要市| 秦皇岛市|