一、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、创建意图过滤器,
`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 事件订阅的方式来实现、在主线程中订阅,在回调中发送事件