关于android:okhttp 3很慢

okhttp 3 very slow

我尝试从服务器获取json,我在服务器上使用https,并且每个http请求都将转到https版本。

我得到了数据,并且我发送的数据也可以发送给,但是最多需要45秒才能获得响应。使用android的http处理程序构建时,相同的代码更快。

如何加快请求速度?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
try {
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder formBuilder = new FormBody.Builder().add("key","2285");
        //formBuilder.add("phone","000000");

        RequestBody formBody = formBuilder.build();
        Log.v("JsonRespons", reqUrl);
        Request request = new Request.Builder()
                .url(reqUrl)
                .post(formBody)
                .build();

        okhttp3.Response response = null;

        response = client.newCall(request).execute();

        if (!response.isSuccessful()) {
            throw new IOException(response.message() +"" + response.toString());
        } else {
            output = response.body().string();
        }

        if(output != null) {
            Log.v("JsonRespons", output.toString());
        }
    } catch (IOException e) {
         e.printStackTrace();
    }


您必须考虑一些重要的事情:

  • AsyncTask一样,从UI thread执行Okhttp3请求。
  • 别忘了在完成后关闭响应主体。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        new AsyncTask<String,Void,String>(){

        @Override
        protected String doInBackground(String... strings) {
            String strResponse = null;
            try {
                Response response = client.newCall(request).execute();
                if (response.isSuccessful()) {
                    strResponse = response.body().string();
                    response.close();  // DON't forget to close body [email protected]().close();
                }

            }catch (Exception ex){
            }
            return strResponse;
        }

        @Override
        protected void onPostExecute(String s) {
            // Update UI here
        }
    };
  • 使用enqueue

    使用Okhttp3线程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            // When failure
            mActivity.runOnUiThread(); // If need to update UI
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()){
                String result = response.body().string();
                mActivity.runOnUiThread(); // update UI under UI thread.
                response.close();  // close response body.
            }
        }
    });
  • 创建OkHttp3Client并配置超时。

    1
    2
    3
    4
    5
    6
    7
    8
    private static OkHttpClient createHttpclient() {
    final OkHttpClient.Builder builder =  new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS);
    setSocketFactory(builder); // To handle SSL certificate.
    return builder.build();
    }