【问题标题】:Android - Loopj AsyncHttpClient: error on second http request with 3g data connectionAndroid - Loopj AsyncHttpClient:使用 3g 数据连接的第二个 http 请求出错
【发布时间】:2014-03-18 10:42:36
【问题描述】:

在写这篇文章之前我已经做了很长时间的搜索,我做了很多测试但没有成功。

我的问题(简而言之):用3g数据连接,每次我做一个get请求,第一次连接就成功了。

现在,如果设备处于待机状态几分钟,当我重复相同的 get request 时,它会立即失败,并出现我在下面报告的错误。一些cmets:

  1. 我仅在 Rooted Nexus 5 (Android 4.4.2) 上遇到此问题
  2. 如果设备不进入待机状态,我无法重现问题
  3. 如果我第三次尝试,连接成功。
  4. 在 WiFi 模式下,我无法重现该问题。
  5. 还使用 Galaxy S3 (android 4.3) 和 Galaxy S1 进行了测试,无法重现该问题。
  6. 我正在使用 Loopj AsyncHttpClient libray (1.4.4) 的最新版本:http://loopj.com/android-async-http/doc/com/loopj/android/http/AsyncHttpClient.html

错误详情

javax.net.ssl.SSLException: Read error: ssl=0x75cab460: I/O error during system call,   
Connection reset by peer
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:689)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:74)
at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:91)
at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

Response body is null, calling onFailure(Throwable, JSONObject)

让我们看一些代码。

我有一个管理所有连接的单例类:

...
//Static istance of my httpClient
private static AsyncHttpClient client = new AsyncHttpClient();
//This is the only parameter that I'm setting for the client
client.setTimeout(30000);
...

//When i need to a get request I just use the following code.
client.get(mContext, url, params, responseHandler);

//For testing purpose, before doing any get request, I've done a clear of all requests,
//but this is not helping with my problem.
client.cancelRequests(mContext, true);

我现在迷路了:我不知道我是否缺少客户端上的某些配置参数,或者客户端是否试图重用错误的连接等等......

我是图书馆的新用户,所以我真的做错了什么。

我希望有人可以帮助我。

提前致谢。

【问题讨论】:

  • 在避免单例后尝试。检查使用直接方法时是否出现错误。

标签: android loopj android-async-http


【解决方案1】:

有时,Android 会清除包含在静态类中的对象(在您的情况下,就是那个单例)。可能此错误与您的 3g 连接无关,而是与内存管理有关。 所以最好的办法是创建一个返回客户端的方法。

public static void getClient(){
    if(MySingleton.client == null){
        MySingleton.client = new AsyncHttpClient();
    }

    return client;
}

我在这里给了你一个例子,你应该对你保存在你的单例中的所有对象做这件事。

当您的应用程序使用大量内存并使用单例时,Android 会很棘手,即使您扩展 Application 类,它也会在 Application 单例中垃圾收集对象。

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    相关资源
    最近更新 更多