Okhttp3.0同步与异步方法使用区别,同时需要注意一些细节问题 您所在的位置:网站首页 同步法和异步法的差别 Okhttp3.0同步与异步方法使用区别,同时需要注意一些细节问题

Okhttp3.0同步与异步方法使用区别,同时需要注意一些细节问题

2024-02-29 15:25| 来源: 网络整理| 查看: 265

一、Okhttp3.0 execute 这是同步请求。对于同步请求在请求时需要开启子线程,请求成功后需要跳转到UI线程修改UI。

new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象 Request request = new Request.Builder() .url("http://www.baidu.com")//请求接口。如果需要传参拼接到接口后面。 .build();//创建Request 对象 Response response = null; response = client.newCall(request).execute();//得到Response 对象 if (response.isSuccessful()) { Log.d("kwwl","response.code()=="+response.code()); Log.d("kwwl","response.message()=="+response.message()); Log.d("kwwl","res=="+response.body().string()); //此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。 } } catch (Exception e) { e.printStackTrace(); } }

二、Okhttp3.0 enqueue 这是异步请求,所以调用enqueue则无需再开启子线程,enqueue方法会自动将网络请求部分放入子线程中执行。enqueue回调方法onResponse与onFailure都执行在子线程中,因此onResponse与onFailure中可以用runOnUiThread(new Runnable() {})来执行更新ui的操作。response.body().string()只能调用一次,在第一次时有返回值,第二次再调用时将会返回null,而且response.body().string()方法必须放在子线程中。当执行这行代码得到结果后,再跳转到UI线程修改UI。 ·············································································································································· 注意事项: 1,回调接口的onFailure方法和onResponse执行在子线程。 注意事项: 2,Response.code是http响应行中的code,如果访问成功则返回200.这个不是服务器设置的,而是http协议中自带的。res中的code才是服务器设置的。注意二者的区别。 3,response.body().string()本质是输入流的读操作,所以它还是网络请求的一部分,所以这行代码必须放在子线程。 4,response.body().string()只能调用一次,在第一次时有返回值,第二次再调用时将会返回null。原因是:response.body().string()的本质是输入流的读操作,必须有服务器的输出流的写操作时客户端的读操作才能得到数据。而服务器的写操作只执行一次,所以客户端的读操作也只能执行一次,第二次将返回null。 5,再次强调,response.body().string()方法必须放在子线程中。当执行这行代码得到结果后,再跳转到UI线程修改UI。

OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://www.baidu.com") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){//回调的方法执行在子线程。 Log.d("kwwl","获取数据成功了"); Log.d("kwwl","response.code()=="+response.code()); Log.d("kwwl","response.body().string()=="+response.body().string()); } } });


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有