iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >详解Android的OkHttp包编写异步HTTP请求调用的方法
  • 395
分享到

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

okhttp调用方法http请求Android 2022-06-06 08:06:57 395人浏览 独家记忆
摘要

OkHttp 除了支持常用的同步 HTTP 请求之外,还支持异步 HTTP 请求调用。在使用同步调用时,当前线程会被阻塞,直到 HTTP 请求完成。当同时发出多个 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的 以下提供一种漂亮(自认...)的写法给大家做参考。



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;
  
  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) {
  
  backgroundHandler.sendEmptyMessage(MSG_QUERY_DATA);
}
@Override
public void onDestroyView() {
  
  backgroundHandler.removeCallbacksAndMessages(null);
  uiHandler.removeCallbacksAndMessages(null);
  backgroundHandler.getLooper().quit();
  super.onDestroyView();
}
@Override
public boolean handleMessage(Message msg) {
  
  if (!isAdded()) return false;
  
  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中使用OkHttp发送HTTP的post请求的方法Android M(6.x)使用OkHttp包解析和发送JSON请求的教程Android中使用OkHttp包处理HTTP的get和post请求的方法Android基于OkHttpUtils网络请求的二次封装Android使用OkHttp请求自签名的https网站的示例Android Okhttp请求查询购物车的实例代码Android中okhttp3使用详解Android OkHttp的简单使用和封装详解Android小知识之OkHttp的2种请求方式详解


--结束END--

本文标题: 详解Android的OkHttp包编写异步HTTP请求调用的方法

本文链接: https://www.lsjlt.com/news/24671.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作