且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

okhttp 3非常慢

更新时间:2023-02-25 19:06:27

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

You must consider some important things :

  • AsyncTask一样从UI thread执行Okhttp3请求.
  • 不要在完成后忘记关闭响应正文.

  • Executing Okhttp3 request away from UI thread, like AsyncTask.
  • Don't forget to close response body after complete.

    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 =@response.body().close();
            }

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

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

  • 使用enqueue

    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并配置超时.

  • Creating OkHttp3Client and configure timeout.

    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();
    }