Android 发送 HTTP 请求最佳实践

作者: deniro | 来源:发表于2018-06-16 12:30 被阅读99次

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

    相关文章

      网友评论

        本文标题:Android 发送 HTTP 请求最佳实践

        本文链接:https://www.haomeiwen.com/subject/isfbeftx.html