我是 Android 编程新手,遇到线程问题。
我基本上使用来自 50 个左右 URL 的图像填充 GridView,但是在我从已知 URL 检索 JSON 对象之前,这些 URL 将不为人所知。我知道我必须为每个 URL 下载启动一堆线程(使用 AsyncTask 类)。
如何有效地将这些线程排队,以便首先执行和完成 JSON 线程,这样当我立即触发这 50 个图像线程时,我可以使用从该线程检索到的数据?
我是 Android 编程新手,遇到线程问题。
我基本上使用来自 50 个左右 URL 的图像填充 GridView,但是在我从已知 URL 检索 JSON 对象之前,这些 URL 将不为人所知。我知道我必须为每个 URL 下载启动一堆线程(使用 AsyncTask 类)。
如何有效地将这些线程排队,以便首先执行和完成 JSON 线程,这样当我立即触发这 50 个图像线程时,我可以使用从该线程检索到的数据?
不要启动 50 个线程。使用单线程。虽然这应该与 UI 线程分开以实现响应性,但不需要生成多个线程,当然也不需要每个 URL.ce 一个线程
只需进行 JSON 网络调用,然后解析响应,然后(在同一个线程中)循环请求每个 URL,并将结果解码为位图。您让他们在某个模型对象中将它们添加到您的 GridView 的适配器中,这将自动触发 GridView 在 UI 线程上更新。
这里有更好的实践,例如延迟加载、缓存和在加载图像时显示占位符图像,但确切的实现变得过于复杂,无法在此处描述。搜索 WeakReferenceMap 和 LruCache 以查找将动态图像加载到 AdapterView 的最佳实践示例。
好吧,你可以只运行第一次 fetch,完成后,从这个主线程触发 50 个线程。由于 Android 3.0 及更高版本会在您从 UI 线程进行网络通信时终止您的应用程序,这AsyncTask
可能是获取 JSON 的一种方式。当它返回时,它可能会触发其他线程。
您仍然应该考虑的一件事是,Android 尽管功能强大,但仍然是功能有限的设备。50 个线程可能会使用目标手机拥有的更多资源,因此您的应用程序可能会被系统杀死(例如,因为 OOME)。所以在桌面上 50 个线程听起来并不多,但它们在手机上却很多。
同样 IIrc,http 规范中有一个限制,一个远程服务器可能只有 4 个(?)同时连接。因此,请考虑将图像加载请求排队并一个接一个地获取它们。