当前位置: 首页 > 面试题库 >

OkHttp3从不慢互联网上的超时

咸高谊
2023-03-14
问题内容

首先,我已经阅读了很多关于我的问题的问题,但是它从来没有
给我解决方案。以下是一些有关

问题:

我在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:

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

enter image description
here

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.

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'
}


 类似资料:
  • 问题内容: 我试图使Oracle RMI- IIOP示例 正常工作,但是在Netbeans中这样做却遇到了问题。 我的代码如下: 介面 接口实现 服务器主 和客户代码 我已经使用rmic生成存根和存根,并且服务器部分的代码工作正常,但是当我运行客户端代码时,我得到了: 虽然这只是我的学习方法,但最终代码将用作模板,因此我可以通过Internet在分布式系统上传输简单对象。我一直在尝试使RMI在In

  • 我对这家公司有着先入为主的厌恶滤镜,这源自自己作为消费者的直接评价、作为社会人的责任使然;此外,作为学生在与从基层到中层员工、从职能到业务人员的交流接触中,更加加深了这层滤镜。但需要说明的是,我十分幸运——最后遇到了很棒的老板和同事,让我出乎意料;奇葩的面试流程让我对面试有了更深刻的理解。 最后拿到offer对应的组真的挺棒的。做的事情算得上核心,也能发挥自己的特长,面试官/团队有技术,不过分卷;

  • 问题内容: 我的MongoDB服务器在上运行,虽然我通常可以正常运行Node.js应用,但是当我断开与Internet的连接时,Mongoose抛出了错误 请注意,我仍然可以从Mongo Shell客户端连接到MongoDB服务器。此外,如果我先启动我的应用程序,然后再断开互联网连接,则我的应用程序可以脱机访问数据库。那么为什么没有互联网就无法启动呢? 编辑:这是完整的错误 编辑:措辞 问题答案:

  • 本文向大家介绍互联网和内联网之间的区别,包括了互联网和内联网之间的区别的使用技巧和注意事项,需要的朋友参考一下 Internet和Intranet都与网络有关,如果着眼于两个词,则仅具有一个字母的区别。但是,除了这些注意事项之外,两者之间还有许多明显的区别,下面将进行讨论。 以下是Internet和Intranet之间的重要区别 序号 键 互联网 内联网 1 定义 互联网是互连的计算机网络的全球系

  • 我正在Java开发一个游戏,使用RMI进行所有网络通信。RMI允许我在服务器上调用方法,但对我来说还不够。我还希望服务器能够在连接的客户端之间传播消息。 我的客户机查找服务器(它的接口扩展为远程)并在其上注册。它允许服务器知道谁已连接。我的客户机还实现了一个扩展远程的接口。这是我的代码的一部分: 接口声明: 服务器端: 客户端: 此解决方案适用于本地,但当我尝试通过Internet使用它时则不起作

  • 若要使用PS Vita与互联网连接,需先准备无线通信的环境。 若您的住家等地无法通过无线通信,可使用公众无线LAN服务(Hotspot)在公众场所与互联网连接。 公众无线LAN服务的使用方法与费用会因该服务的提供者而异。详细请询问该服务的提供者。 使用Wi-Fi连接 若要使用Wi-Fi与互联网连接,需准备以下内容。此外,接入点的设定通常会通过电脑进行。 与网络服务商签订合约 接入点或无线路由器 接