亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

OkHttp 除了支持常用的同步 HTTP 請(qǐng)求之外,還支持異步 HTTP 請(qǐng)求調(diào)用。在使用同步調(diào)用時(shí),當(dāng)前線程會(huì)被阻塞,直到 HTTP 請(qǐng)求完成。當(dāng)同時(shí)發(fā)出多個(gè) HTTP 請(qǐng)求時(shí),同步調(diào)用的性能會(huì)比較差。這個(gè)時(shí)候通過(guò)異步調(diào)用可以提高整體的性能。
在通過(guò) newCall 方法創(chuàng)建一個(gè)新的 Call 對(duì)象之后,不是通過(guò) execute 方法來(lái)同步執(zhí)行,而是通過(guò) enqueue 方法來(lái)添加到執(zhí)行隊(duì)列中。在調(diào)用 enqueue 方法時(shí)需要提供一個(gè) Callback 接口的實(shí)現(xiàn)。在 Callback 接口實(shí)現(xiàn)中,通過(guò) onResponse 和 onFailure 方法來(lái)處理響應(yīng)和進(jìn)行錯(cuò)誤處理。
異步調(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ù)器端錯(cuò)誤: " + response);
      }

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

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

/* 以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)文章

最新評(píng)論