2

アプリに問題があります。市場レポートでは、HttpClient エラーを含む ANR 再投稿が頻繁に表示されます。がある

java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2016) at org.apache.http.impl.conn.tsccm.WaitingThread.await(WaitingThread.java:159) at org.apache.http. impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:339) org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238) at org.apache.http.impl.conn .tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:175) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:325) at org.apache.http.impl.client.AbstractHttpClient.execute( AbstractHttpClient.java:580) の org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:512) の org.apache.http.impl.client.AbstractHttpClient.実行 (AbstractHttpClient.java:490)


java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2022) で java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413) で java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor. java:1014) で java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1074) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574) で java.lang.Thread.run(Thread) .java:1020)


DALVIK スレッド: (ミューテックス: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0) "main" prio=5 tid=1 ネイティブ | group="main" sCount=1 dsCount=0 obj=0x40027550 self=0xcfc0 | sysTid=2557 nice=0 sched=0/0 cgrp=デフォルト ハンドル=-1345006240 | schedstat=( 6440246597 181026702867 12047 ) org.apache.harmony.luni.platform.OSNetworkSystem.connect(ネイティブメソッド) at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357) at org.apache.harmony.luni .net.PlainSocketImpl.connect(PlainSocketImpl.java:207) で org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:440) で java.net.Socket.connect(Socket.java:1013) でorg.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) org.apache.http.impl.conn.DefaultClientConnectionOperator.

このエラーを回避する方法はありますか? おそらく、httpClient を使用するためのベスト プラクティスはありますか? 私のアプリでは、私は使用されています:

 public ApiImpl() {
    this.httpClient = new DefaultHttpClient();
    ClientConnectionManager mgr = httpClient.getConnectionManager();
    HttpParams params = httpClient.getParams();
    this.httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(params, mgr.getSchemeRegistry()), params);
}


public class Client {

private static Api api;
private static Client instance = null;


public static Client getInstance() {
    if (instance == null) {
        instance = new Client();
    }
    return instance;
}

 private Client() {
    api = new ApiImpl();
}

}

次に、コードで次を使用しています

Client client = Client.getInstance();
client.do();
4

2 に答える 2

0

問題は、応答本文全体を読み取れないことでした。ブール結果を期待した場合にのみ、応答がnullかどうかを確認します。いずれの場合も応答本文を読み取り、httpクライアントインスタンスを次に呼び出す前に応答ストリームを閉じる必要があります。例えば

  InputStream stream = response.getEntity().getContent();

  private String streamToString(InputStream is) {
        if (is == null) return null;
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
于 2012-08-23T12:54:10.643 に答える
0

アクティビティのメイン UI スレッドから最後のスニペットを呼び出している可能性があります。その場合は、別のスレッドで HttpClient.execute のような待ち時間が長くなる可能性のある操作を実行することを検討する必要があります。別の Thread または Executor を単純に使用できます。

UI でネットワーク リクエストを調整する必要がある場合は、AsyncTaskまたはLoadersを試してください。

于 2011-10-13T12:45:19.823 に答える