okHttp异步请求的回调在UI线程即主线程中执行

一、okHttp使用
二、在主线程中执行请求回调的方法

一、
1、先在模块的build.gradle–>dependencies中添加依赖

implementation 'com.squareup.okhttp3:okhttp:4.1.0'

2、新建 OkHttpClient对象

OkHttpClient client = new OkHttpClient();

3、构造 Request 对象

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

4、将 Request 对象封装为 Call并执行同步或异步请求

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {}//发送失败回调函数

@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
final String string = response.body().string();
Log.i(TAG, "onResponse: "+string);
runOnUiThread(new Runnable() {    
@Override    
public void run() {        
tvText.setText(string);    
}
});
 }});

注:Android3.0 之后已经不允许在主线程中访问网络了,所有异步请求(enqueue)都会新启一个线程,所以在回调函数中使用runOnUiThread使得run()中代码在主线程中执行。

二、
除了使用runOnUiThread
其他使得run()方法在主线程中执行的方式:
1、

new Handler(Looper.getMainLooper()).post(new Runnable() {    
@Override    
public void run() {        
//tvText.setText(string);    
}});

2、
在主线程中定义一个handler对象

`private static Handler handler = new Handler(){    `
    `@Override    `
`public void handleMessage(@NonNull Message msg) {        `
    //`IpBean ipBean = (IpBean) msg.obj;        `
    //`tvText.setText(ipBean.toString());    `
`}};`

重写handleMessage方法接收回调中传过来的参数

在回调函数中:通过Message 来传值

`Message message = Message.obtain();
message.obj = ipBean;
handler.sendMessage(message);`

3、利用广播方式:
1、在主线程中创建广播接收器Receiver继承BroadcastReceiver,
并实现onReceive方法,在onReceive方法中接收传入值。
2、创建意图过滤器,

扫描二维码关注公众号,回复: 9129782 查看本文章
`IntentFilter filter = new IntentFilter("ip");`

实例化广播接收器、:receiver = new Receiver();

并注册广播:LocalBroadcastManager.getInstance(this).registerReceiver(receiver,filter);
3、在请求的回调中发送广播:

`Intent intent = new Intent("ip");`//构建出了一 个 Intent 对象,并把要发送的广播的值传入
`intent.putExtra("data",ipBean);`
`LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(intent);`

4、在主线程的广播接收器onReceive方法中:

intent.getSerializableExtra("data")//获取数据

也可以用EventBus 事件订阅的方式来实现、在主线程中订阅,在回调中发送事件

发布了43 篇原创文章 · 获赞 22 · 访问量 5947

猜你喜欢

转载自blog.csdn.net/qq_41466437/article/details/102409979