【问题标题】:com.android.volley.NoConnectionError after pausing appcom.android.volley.NoConnectionError 暂停应用程序后
【发布时间】:2013-09-12 06:13:50
【问题描述】:

我正在使用 Google Volley 和 Gson 编写我的应用程序,以与使用 OkHttp 作为 HTTP-Stack 的 REST 服务通信。这在大多数情况下都很好用,但是当我暂停我的应用程序并返回它时,HTTP 请求不适用于此异常:

     09-08 19:29:19.611: E/ASDF(21827): com.android.volley.NoConnectionError: java.io.EOFException
     09-08 19:29:19.611: E/ASDF(21827):     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:125)
     09-08 19:29:19.611: E/ASDF(21827):     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)
     09-08 19:29:19.611: E/ASDF(21827): Caused by: java.io.EOFException
     09-08 19:29:19.611: E/ASDF(21827):     at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:206)
     09-08 19:29:19.611: E/ASDF(21827):     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:98)
     09-08 19:29:19.611: E/ASDF(21827):     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
     09-08 19:29:19.611: E/ASDF(21827):     at com.squareup.okhttp.internal.http.HttpEngine.initContentStream(HttpEngine.java:461)
     09-08 19:29:19.611: E/ASDF(21827):     at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:659)
     09-08 19:29:19.611: E/ASDF(21827):     at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:346)
     09-08 19:29:19.611: E/ASDF(21827):     at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:295)
     09-08 19:29:19.611: E/ASDF(21827):     at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:489)
     09-08 19:29:19.611: E/ASDF(21827):     at com.squareup.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:136)
     09-08 19:29:19.611: E/ASDF(21827):     at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:109)
     09-08 19:29:19.611: E/ASDF(21827):     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:93)
     09-08 19:29:19.611: E/ASDF(21827):     ... 1 more

这是随机发生的。不是每次我暂停我的申请。我真的不知道从哪里开始。

【问题讨论】:

  • 这是否仍然会关闭 wifi 优化(设置 > Wifi > 菜单(三点按钮)> 高级 > Wifi 优化或修改睡眠策略)?如果是这样,则设备可能会在您发出 http 请求但尚未准备好时尝试重新初始化 wifi 连接。 HTH!
  • 让我们试一试。因此,换句话说:如果发生此 EOFException,我应该重试添加请求吗?
  • 试过了。结果相同。该错误很容易重现:只需暂停应用程序并重新启动它。即使在 eclipse 中重新安装它也会产生错误。但是在手动卸载之前重新安装,一切都很好。

标签: android android-volley okhttp


【解决方案1】:

这个问题似乎是由Android本身的一个错误引起的,应该修复!?此处描述了该问题及其修复:Android issue 24672

因此,将这段代码添加到我的 OkHttp URLConnection 工厂可以立即解决问题:

  @Override protected HttpURLConnection createConnection(URL url) throws IOException {
    HttpURLConnection connection = client.open(url);
    // Fix for bug in Android runtime(!!!):
    // https://code.google.com/p/android/issues/detail?id=24672
    connection.setRequestProperty("Accept-Encoding", "");

    return connection;
  }   

【讨论】:

  • 我正在使用 volley 库。如何覆盖createConnection?没有这样的功能!
  • 正如我在上面这段代码所说的:那是 OkHttp HttpStack 类中的一段代码,而不是凌空本身!你必须写一个HttpStack,在那里你可以相应地设置标题。
  • 最简单的方法是使用 OkHttp 作为堆栈。或者你修改 OkHttp 例子:gist.github.com/JakeWharton/5616899
  • 查看此内容以了解如何覆盖 Volley 连接属性:stackoverflow.com/a/25887160/369317
【解决方案2】:

我有这个问题大约一个小时。如果您尝试连接到虚拟机 rest 服务,则需要更改 android 模拟器上的 hosts 文件。

我困惑了这么久,因为我已经这样做了。我认为它不会在模拟器重新启动之间保留主机文件。这很烦人,但现在我(也许你)知道......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多