Android线程 - 在执行所有其他线程之前执行一个线程

时间:2012-07-23 02:08:35

标签: android multithreading android-asynctask

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

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