1. okhttp3
public class HttpUtil {
public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
}
}
sendOkHttpRequest()
方法中有一个 okhttp3.Callback
参数, 这个是 Okhttp 库中自带的一个回调接口。在 client.newCall()
之后调用 enqueue()
方法,并且把 okhttp3.Callback
参数传入。 Okhttp 在enqueue()
方法内部已经帮我们开好子线程,然后会在子线程中执行 HTTP 请求,并将最终的请求结果回调到 okhttp3.Callback 当中。
我们在调用 sendOkHttpRequest()
方法的时候可以这样写:
HttpUtil.sendOkHttpRequest(address, new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseText = response.body().string();
...........
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
...........
}
});
}
@Override
public void onFailure(Call call, IOException e) {
//通过 runOnUiThread() 方法回到主线程处理逻辑
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
...........
}
});
}
});
另外,不管是使用 HttpURLConnection 还是 OkHttp, 最终的回调接口都还是在子线程中运行的,所以我们不能在子线程执行任何的 UI操作,需要借助 runOnUiThread()
方法把线程转换为主线程。