首先,我已经阅读了很多关于我的问题的问题,但是它从来没有 给我解决方案。以下是一些有关
问题:
我在Web服务应用程序中使用Okhhtp3库。它工作 正常,但是当互联网连接速度慢或连接不可靠时,它就卡住了 ,永远不会超时,也永远不会调用超时异常或失败方法。
这是客户端代码:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .retryOnConnectionFailure(false) .build();
20秒后如何获取超时异常或调用失败方法?
Thanks
正如Trevor Halvorson指出的那样,您可以callTimeout在客户端 构建期间设置,方法是:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) .callTimeout(20, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .retryOnConnectionFailure(false) .build();
我已经在使用以下版本3.14.0的虚拟项目中进行了个人测试okhttp3:
3.14.0
implementation 'com.squareup.okhttp3:okhttp:3.14.0'
And setting a timout of 5 seconds and my emulator connection to GPRS and Poor connectivity I get
java.net.SocketExcpetion: Socket closed: timeout
This is my full dummy activity :
package com.example.shadowsheep.myapplication; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import java.io.IOException; import java.io.InterruptedIOException; import java.util.concurrent.TimeUnit; import androidx.appcompat.app.AppCompatActivity; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView helloTextView = findViewById(R.id.helloTextView); OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .callTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .retryOnConnectionFailure(false) .build(); Request request = new Request.Builder() .url("https://www.versionestabile.it/blog") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); Log.d("OKHTTP3", e.getMessage()); // You get this failure runOnUiThread(() -> helloTextView.setText("TIMEOUT - FAILURE -> " + e.getMessage())); } @Override public void onResponse(Call call, Response response) throws IOException { try { final String _body = response.body().string(); Log.d("OKHTTP3", _body); runOnUiThread(() -> { helloTextView.setText(_body); }); } catch (InterruptedIOException e) { runOnUiThread(() -> { // Or this exception depending when timeout is reached helloTextView.setText("TIMEOUT EXCEPTION->"+ e.getCause() + ": " + e.getMessage()); }); } } }); } }
I’ll give you also my app build.gradle file.
build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.shadowsheep.myapplication" minSdkVersion 24 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0-alpha03' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.2-alpha02' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02' implementation 'com.squareup.okhttp3:okhttp:3.14.0' }