我的應用程序出現了一些問題。 在市場報告中經常會出現ANR與HttpClient錯誤的地址。有Android。使用HttpClient避免ANR
java.util.concurrent.locks.AbstractQueuedSynchronizer中的$ ConditionObject.await(AbstractQueuedSynchronizer.java:2016) 在org.apache.http.impl.conn.tsccm.WaitingThread.await(WaitingThread.java: 159) at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:339) at org.apache.http.impl.conn.tsccm.ConnPoolByRoute $ 1.getPoolEntry(ConnPoolByRoute.java:238 ) 在org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager $ 1.getConnection(ThreadSafeClientConnManager.java:175) 在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:325) 在org.apache.http.imp l.client.AbstractHttpClient.execute(AbstractHttpClient.java:580) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:512) at 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) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1014)(ThreadPoolExecutor.java:574) at java.lang.Thread.run(Thread。)在線程序,請參閱java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:574)的java:1020)
DALVIK線程: (互斥:TLL = 0 TSL = 0 TSCL = 0 GHL = 0 HWL = 0 hwll = 0) 「主」 PRIO = 5 TID = 1 NATIVE | group =「main」sCount = 1 dsCount = 0 obj = 0x40027550 self = 0xcfc0 | sysTid = 2557 nice = 0 sched = 0/0 cgrp =默認句柄= -1345006240 | schedstat =(6440246597 181026702867 12047) at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method) at dalvik.system.BlockGuard $ WrappedNetworkSystem.connect(BlockGuard.java:357) at org.apache。在java.net.Socket.connect(Socket。)上的org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:440) 。的java:1013) 在org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143) 在org.a提供org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) (org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359) at org.apache.http.impl。 client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 在org.apache.http.impl.client.AbstractHttpClient.execute( AbstractHttpClient.java:465
有什麼辦法可以避免這個錯誤?也許一些最佳實踐如何使用httpClient?在我的應用我usung:
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();
它會在getInstance()調用還是執行http請求時報告anr? – Blackbelt
當我調用execute() –
那是因爲httpclient執行調用,是一個阻塞調用。由於延遲執行,UI線程似乎被阻塞。你需要運行執行,並在一個單獨的線程或異步任務中的每個阻塞調用 – Blackbelt