草庐IT

Android - 定期发生 HttpClient 超时

coder 2023-12-12 原文

您好,我已经问过这个问题,但这次我检查允许所有证书的方法不会导致问题。

我开发了一个同样在 iPhone 上的应用程序。问题出在 api 请求上。我为所有请求设置超时。有时它会在 30 - 60 秒之间出现中断。看起来像这样,应用程序执行了几个请求,而不是中断,所有时间超时,大约 45 秒后一切正常。

不知道是服务器问题还是安卓问题

此问题不会出现在装有 IOS 5 的 iPhone 上,但也会出现在 IOS 4 上。

我检查 HttpClient 和 HttpsURLConnection。

连接是 https,也正在尝试直接 IP 地址。

所有请求都有同样的问题,所有请求都在异步任务中。

它们看起来都一样:

DefaultHttpClient client = new HttpSupport().getNewHttpClient();

    client.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT),new UsernamePasswordCredentials(user, pass));

    HttpGet httget = new HttpGet("xxxxxxxxxxxxxxxxxxxxxxx");
    httget.setHeader("Accept", "application/json");

    HttpResponse respond = null;  

    try 
    {
        respond = client.execute(httget);
    } 
    catch (ClientProtocolException e) 
    {
        Log.e(TAG,"getEvents, ClientProtocolException");
    } 
    catch (IOException e) 
    {           
        Log.e(TAG,"getEvents, IOException: " + e.getMessage());
    }

我的 HttpSupport 类的代码在我的上一个问题中:Android - API Requests

会不会是服务器故障? 感谢您的帮助。

最近我注意到应用程序在 client.execute 上挂起...尝试这样做:android httpclient hangs on second request to the server (connection timed out) ,但无济于事。也许不是 api 错误,而是 Android 本身。这个应用程序经常指向 api,但对于大多数请求,一切都很好。

仍然无法摆脱 30-45 秒的挂断。

今天我再次测试了该应用程序,我注意到错误仅发生在 Samsung Tablet 3.2 的 wi-fi 连接上。在带有 2.3.7(wi-fi 和 3g)的 Wildfire 上,一切似乎都很好。我并不是说移动设备上不会出现问题,但在测试时我没有注意到超时。

最佳答案

您的客户端设置的超时时间太短 - 在移动连接上,您预计最多需要 30 秒才能建立连接,超过 30 秒才能收到响应。

您的代码(通过您的链接):

int timeoutConnection = 3000;
        HttpConnectionParams.setConnectionTimeout(params, timeoutConnection);
        // Set the default socket timeout (SO_TIMEOUT) 
        // in milliseconds which is the timeout for waiting for data.
        int timeoutSocket = 5000;
        HttpConnectionParams.setSoTimeout(params, timeoutSocket);

以毫秒为单位。所以你的连接超时是 3 秒,响应是 5 秒。

我会分别做 30000 和 60000。

此外,如果您想排除任何服务器问题,请安装一个 HTTP 代理,如 fiddler2并用它来显示每个 HTTP/HTTPS 请求,您将看到每个服务器响应。然后您将查看客户端或服务器是否行为不当。

关于Android - 定期发生 HttpClient 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736774/

有关Android - 定期发生 HttpClient 超时的更多相关文章

  1. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  2. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  5. ruby - 当 attr_accessor 在类方法中时会发生什么? - 2

    所以我想到了这个,想知道当下面的一些事情完成后会发生什么。classTestdefself.abcattr_accessor:Johnendendobject=Test.newputs"beforecallingclassmethodabc:#{object.class.instance_methods(false)}"Test.abcputs"aftercallingclassmethodabc:#{object.class.instance_methods(false)}"这里我检查的是,getter和setter方法是否以这种方式创建。如果是这样,是那些实例方法或类方法。首先我创

  6. Ruby 在 n *milli* 秒后超时一段代码 - 2

    在Ruby中,我需要在n毫秒秒后暂停一段代码的执行。我知道RubyTimeout库支持秒的超时:http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/index.html这可能吗? 最佳答案 只需为超时使用十进制值。n毫秒的示例:Timeout::timeout(n/1000.0){sleep(100)} 关于Ruby在n*milli*秒后超时一段代码,我们在StackOverflow上找到一个类似的问题: https:

  7. ruby - 当你有一个没有参数的 case 语句并且 when 子句是 lambda 时会发生什么? - 2

    这段代码没有像我预期的那样执行:casewhen->{false}then"why?"else"ThisiswhatIexpect"end#=>"why?"这也不是casewhen->(x){false}then"why?"else"ThisiswhatIexpect"end#=>"why?"第一个then子句在两种情况下都被执行,这意味着我提供给when子句的lambda没有被调用。我知道无论when子句的主题是什么,都应该调用大小写相等运算符===。我想知道当没有为case提供参数时,===的另一边会发生什么。我在想它可能是nil,但它不可能是:->{false}===nil#=>

  8. ruby HTTPClient : How to use persistent connections? - 2

    如何通过HTTPClient使用持久HTTP连接?发送HTTP请求时是否只是设置KeepAlive的问题?文档指出支持持久连接,但没有告诉我们如何使用它们。 最佳答案 是availableinNet::HTTP如文档中所写,Net::HTTP.startimmediatelycreatesaconnectiontoanHTTPserverwhichiskeptopenforthedurationoftheblock.Theconnectionwillremainopenformultiplerequestsintheblockift

  9. ruby-on-rails - 获取最近发生的星期三? - 2

    如何使用Ruby(和Rails,如果有相关的辅助方法)获取最近发生的星期三?最终需要实际日期(5/1/2013)。 最佳答案 time=Time.nowdays_to_go_back=(time.wday+4)%7last_wed=days_to_go_back.days.ago 关于ruby-on-rails-获取最近发生的星期三?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions

  10. ruby-on-rails - 发生异常时发送电子邮件不起作用,使用 exception_notification - 2

    我正在从rails2.3迁移到rails3.1,我试图在生成异常时发送电子邮件。我正在使用exception_notificationgem。我的其余电子邮件都在工作。但是异常邮件不会被解雇。以下是我的staging.rb文件中的设置。config.action_mailer.perform_deliveries=trueconfig.action_mailer.raise_delivery_errors=true下面是application.rb中的代码C::Application.config.middleware.useExceptionNotification::Rack,:e

随机推荐