Android|Android 发送 HTTP 请求最佳实践
发送 HTTP 请求的方法其实都有一套固定的模板,所以我们可以把这些方法整合到一个工具类中。
public class HttpUtils {
/**
* 发送 URL 请求
*
* @param url
* @return
*/
public static String request(String url) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
try {
Response response = client.newCall(request).execute();
//发送请求
return response.body().string();
} catch (IOException e) {
throw new HttpUtilsException("发送 URL 请求", e);
}
}
}
这样做粗看起来似乎可以,但因为网络请求通常都是耗时操作,所以我们必须在这个方法中开启子线程,即执行异步操作。当方法调用结束时,再通过回调方法传回响应的内容:
定义 HTTP 回调接口:
public interface HttpCallback {/**
* 成功响应后回调
*
* @param response
*/
void success(String response);
/**
* 发生错误后回调
*
* @param e 异常
*/
void error(Exception e);
}
这里定义了两个方法,一个用于成功响应后回调;另一个用于发生错误后回调。
请求方法:
/**
* 发送 URL 请求
*
* @param url
* @return
*/
public static void request(final String url, final HttpCallback callback) {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
try {
Response response = client.newCall(request).execute();
//发送请求
callback.success(response.body().string());
} catch (IOException e) {
callback.error(e);
throw new HttpUtilsException("发送 URL 请求", e);
}
}
}).start();
}
这样就可以执行异步请求操作啦O(∩_∩)O哈哈~
其实 OkHttp 库中已经提供了执行异步请求操作的方法啦,让我们来看一看吧:
/**
* 发送 URL 请求
*
* @param url
* @return
*/
public static void request(final String url, final Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(callback);
}
在
Call#enqueue(Callback responseCallback)
方法中,就会开启子线程执行 HTTP 请求操作啦,请求结果会放入回调方法中。使用方法:
HttpUtils.request("http://10.0.2.2/data.json", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//异常处理
}@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "响应:" + response.body().string());
}
});
是不是很方便呀O(∩_∩)O哈哈~
【Android|Android 发送 HTTP 请求最佳实践】注意:因为最终的回调接口还是在子线程中运行,所以我们必须借助于
runOnUiThread()
方法来切换线程后,再进行 UI 操作。推荐阅读
- android第三方框架(五)ButterKnife
- python学习之|python学习之 实现QQ自动发送消息
- Android中的AES加密-下
- 画解算法(1.|画解算法:1. 两数之和)
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- ts泛型使用举例
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库