发送 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 哈哈~
注意: 因为最终的回调接口还是在子线程中运行, 所以我们必须借助于 runOnUiThread() 方法来切换线程后, 再进行 UI 操作.
来源: http://www.jianshu.com/p/52bc93abc783