okhttp 3 very slow
我尝试从服务器获取json,我在服务器上使用https,并且每个http请求都将转到https版本。
我得到了数据,并且我发送的数据也可以发送给 s>,但是最多需要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
22new 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
16client.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
8private 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();
}