安卓。使用 HttpClient 避免 ANR

标签 android error-handling httpclient android-anr-dialog

我的应用程序有一些问题。 在市场报告中经常出现 ANR repostr with HttpClient 错误。有

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) at 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) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:512) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:490)


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


DALVIK THREADS: (mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0) "main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCount=0 obj=0x40027550 self=0xcfc0 | sysTid=2557 nice=0 sched=0/0 cgrp=default handle=-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.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:207) at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:440) at java.net.Socket.connect(Socket.java:1013) at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465

有什么方法可以避免这种错误?也许一些最佳实践如何使用 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();

最佳答案

您可能正在从 Activity 的主 UI 线程中调用最后一个 fragment 。如果是这样,您应该考虑在另一个线程中执行潜在的高延迟操作,如 HttpClient.execute。您可以简单地使用另一个线程或执行器。

如果您需要协调网络请求与 UI,请尝试 AsyncTaskLoaders .

关于安卓。使用 HttpClient 避免 ANR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7754023/

相关文章:

java - HttpClient只会执行一次Android

android - 广告加载期间的布局问题

android - 找不到库引用 Lib\Copy of google-play-services_lib

java - 旋转器 : getItemAtPosition(position) is returning always null/empty

angular - 如何使用rxjs运算符多次获取最新值

.NET 4.5 HttpClient PUT 或 POST over SSL 总是失败

android - Xamarin 使用 OKHttpNetworkHandler 和 AFNetworkHandler 的引用

android - *被动*收听 gps 位置更新

Javascript 在 catch block 中丢失了回溯

error-handling - 问号运算符如何转换错误类型? [复制]