详解Android的OkHttp包编写异步HTTP请求调用的方法

 更新时间:2016年07月13日 11:48:52   作者:bng86  
OkHttp支持Callback异步回调来实现线程的非阻塞,下面我们就来详解Android的OkHttp包编写异步HTTP请求调用的方法,需要的朋友可以参考下

OkHttp 除了支持常用的同步 HTTP 请求之外,还支持异步 HTTP 请求调用。在使用同步调用时,当前线程会被阻塞,直到 HTTP 请求完成。当同时发出多个 HTTP 请求时,同步调用的性能会比较差。这个时候通过异步调用可以提高整体的性能。
在通过 newCall 方法创建一个新的 Call 对象之后,不是通过 execute 方法来同步执行,而是通过 enqueue 方法来添加到执行队列中。在调用 enqueue 方法时需要提供一个 Callback 接口的实现。在 Callback 接口实现中,通过 onResponse 和 onFailure 方法来处理响应和进行错误处理。
异步调用的示例

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("服务器端错误: " + response);
      }

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

觉得okHttp最难写的地方应该就是Callback了。
相信很多人都会遇到,如果Callback回来之后,我的Activity finish了,或是我的Fragment replace了。
此时更改UI,就会产生找不到View的问题。
而且Callback回来,居然是在backgroundThread上,
这时候如果要操作View又要切换到mainThread去,略显麻烦。
所以我在写的时候,是没有使用Callback的 以下提供一种漂亮(自认...)的写法给大家做参考。

/* 以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結束掉 */
  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;
  }
}

相关文章

  • android实现可自由移动、监听点击事件的悬浮窗

    android实现可自由移动、监听点击事件的悬浮窗

    这篇文章主要为大家详细介绍了android实现可自由移动、监听点击事件的悬浮窗,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Android如何监测文件夹内容变化详解

    Android如何监测文件夹内容变化详解

    最近在开发android应用程序的时候遇到了一个监测文件夹的功能,所以下面这篇文章主要给大家介绍了关于Android如何监测文件夹内容变化的相关资料,需要的朋友可以参考下
    2021-12-12
  • Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享

    Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享

    Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享,需要的朋友可以参考一下
    2013-05-05
  • Android Studio 3.0的下载安装教程

    Android Studio 3.0的下载安装教程

    Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他一些新功能,今天我们主要来看看如何更新Android Studio 3.0
    2017-10-10
  • Android Java调用自己C++类库的实例讲解

    Android Java调用自己C++类库的实例讲解

    今天小编就为大家分享一篇关于Android Java调用自己C++类库的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Android模仿微信收藏文件的标签处理功能

    Android模仿微信收藏文件的标签处理功能

    这篇文章主要介绍了android模仿微信收藏文件的标签处理功能的相关资料,也可以删除已编辑菜单,需要的朋友可以参考下
    2016-11-11
  • Android仿微信录音功能

    Android仿微信录音功能

    这篇文章主要为大家详细介绍了Android仿微信录音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 老生常谈ProgressBar、ProgessDialog的用法

    老生常谈ProgressBar、ProgessDialog的用法

    下面小编就为大家带来一篇老生常谈ProgressBar、ProgessDialog的用法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • ObjectAnimator属性动画源码分析篇

    ObjectAnimator属性动画源码分析篇

    今天小编就为大家分享一篇关于ObjectAnimator属性动画源码分析篇,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • android实现直播点赞飘心动画效果

    android实现直播点赞飘心动画效果

    这篇文章主要为大家详细介绍了android实现直播点赞飘心动画效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论