1

この投稿を行う前に長い検索を行い、多くのテストを行いましたが、成功しませんでした。

私の問題(要するに): 3gデータ接続では、get requestを実行するたびに、初めて接続が成功して完了します。

ここで、デバイスが数分間スタンバイ状態になると、同じget 要求を繰り返すと、以下で報告したエラーですぐに失敗します。いくつかのコメント:

  1. この問題は、ルート化されたNexus 5 (Android 4.4.2)でのみ発生しています。
  2. デバイスがスタンバイ状態にならない場合、問題を再現できません
  3. 3 回目に接続を試みると、接続は正常に完了します。
  4. WiFi モードでは、問題を再現できません。
  5. Galaxy S3 (android 4.3) と Galaxy S1 でもテスト済みで、問題を再現できません。
  6. ここにあるLoopj AsyncHttpClientライブラリ(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);

私は今迷子になっています: クライアントのいくつかの構成パラメーターが欠落しているかどうか、またはクライアントが間違った接続を再利用しようとしているかどうかなどはわかりません...

私はライブラリの新しいユーザーなので、本当に間違ったことをしている可能性があります。

誰かが私を助けてくれることを願っています。

前もって感謝します。

4

1 に答える 1

0

Android が静的クラス (あなたの場合はそのシングルトン) に含まれるオブジェクトをクリアすることがあります。このエラーは 3g 接続に関するものではなく、メモリ管理に関するものである可能性があります。したがって、クライアントを返すメソッドを作成するのが最善です。

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

    return client;
}

ここで例を挙げました。シングルトンに保存しているすべてのオブジェクトでそれを行う必要があります。

大量のメモリを使用し、シングルトンを使用するアプリがある場合、Android は注意が必要です。アプリケーション クラスを拡張しても、アプリケーション シングルトン内のオブジェクトをガベージ コレクションできます。

于 2014-03-26T12:36:11.613 に答える