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 操作。

    推荐阅读