1

我是 Android 编程新手,遇到线程问题。

我基本上使用来自 50 个左右 URL 的图像填充 GridView,但是在我从已知 URL 检索 JSON 对象之前,这些 URL 将不为人所知。我知道我必须为每个 URL 下载启动一堆线程(使用 AsyncTask 类)。

如何有效地将这些线程排队,以便首先执行和完成 JSON 线程,这样当我立即触发这 50 个图像线程时,我可以使用从该线程检索到的数据?

4

2 回答 2

2

不要启动 50 个线程。使用单线程。虽然这应该与 UI 线程分开以实现响应性,但不需要生成多个线程,当然也不需要每个 URL.ce 一个线程

只需进行 JSON 网络调用,然后解析响应,然后(在同一个线程中)循环请求每个 URL,并将结果解码为位图。您让他们在某个模型对象中将它们添加到您的 GridView 的适配器中,这将自动触发 GridView 在 UI 线程上更新。

这里有更好的实践,例如延迟加载、缓存和在加载图像时显示占位符图像,但确切的实现变得过于复杂,无法在此处描述。搜索 WeakReferenceMap 和 LruCache 以查找将动态图像加载到 AdapterView 的最佳实践示例。

于 2012-07-23T02:53:28.183 回答
1

好吧,你可以只运行第一次 fetch,完成后,从这个主线程触发 50 个线程。由于 Android 3.0 及更高版本会在您从 UI 线程进行网络通信时终止您的应用程序,这AsyncTask可能是获取 JSON 的一种方式。当它返回时,它可能会触发其他线程。

您仍然应该考虑的一件事是,Android 尽管功能强大,但仍然是功能有限的设备。50 个线程可能会使用目标手机拥有的更多资源,因此您的应用程序可能会被系统杀死(例如,因为 OOME)。所以在桌面上 50 个线程听起来并不多,但它们在手机上却很多。

同样 IIrc,http 规范中有一个限制,一个远程服务器可能只有 4 个(?)同时连接。因此,请考虑将图像加载请求排队并一个接一个地获取它们。

于 2012-07-23T02:16:21.127 回答