gpt4 book ai didi

java - HttpClient 长时间停止,即使设置了超时参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:13:10 24 4
gpt4 key购买 nike

我有一个应用程序正在从远程服务下载大量缩略图和其他资源。

我正在使用 DefaultHttpClient 的单个实例和我编写的用于安排所有下载的自定义类。所有下载都通过 AsyncTask 在后台线程上串行运行。在 AsyncTask 中执行 onPostExecute 之前,我不会重新运行我的下载例程。

这通常很完美。如果我排队 20 张图像,我的调度程序会很好地完成它的工作。但是,我遇到过程序在调用 client.execute 时停止的情况(其中 client 是我的 DefaultHttpClient 实例)。我可以通过在应用程序中导航并执行随机操作(滚动列表、在 Activity 之间来回导航等)来莫名其妙地恢复该过程。 就好像我正在做的事情是向已停滞或死锁的线程发送“唤醒”消息。

我在我的应用程序的所有移动部分添加了令人讨厌的大量日志记录,以查看此过程的外部是否导致某种死锁情况。我通过 pid 查看 LogCat 以查看在停顿点或恢复点我的进程中是否发生了任何其他事情,我没有看到任何异常情况。最奇怪的是我可以一遍又一遍地复制确切的条件。

FWIW,我已经在传递给执行方法的 HttpClient 实例和 HttpGet 实例上设置了套接字超时和连接超时。这不会导致 execute 方法提前返回或抛出异常或类似情况。当过程“踢回来”时,HttpClient.execute 返回一个有效的 HttpResponse,一切都正常运行。

关于我可以调试以找出问题出在哪里的事情有什么想法吗?我知道这是一个非常特殊的情况,但是一般情况下是否有专门调试 Android 中的 DefaultHttpClient 或 http 流量的高级方法?

谢谢!

最佳答案

您是否跨线程共享相同的 HttpClient?默认情况下它不是线程安全的,因此您可能需要检查一下。不过很可能它阻塞了 I/O,因此您应该进行一些连线调试。您可以使用类似这样的东西来启用 HttpClient 线转储日志:

Logger.getLogger("org.apache.http.wire").setLevel(Level.FINEST);
Logger.getLogger("org.apache.http.headers").setLevel(FINEST);
Logger.getLogger("httpclient.wire.header").setLevel(FINEST);
Logger.getLogger("httpclient.wire.content").setLevel(FINEST);

System.setProperty("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "debug");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "debug");

要启用它,请执行以下 shell 命令。 Wire 日志将输出到 logcat:

adb shell setprop log.tag.org.apache.http VERBOSE 
adb shell setprop log.tag.org.apache.http.wire VERBOSE
adb shell setprop log.tag.org.apache.http.headers VERBOSE

关于java - HttpClient 长时间停止,即使设置了超时参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7087085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com