2012-07-23 175 views
1

我是Android编程的新手,我遇到了线程问题。Android线程 - 在执行所有其他线程之前执行一个线程

我基本上填充有来自50页左右的URL图像的GridView控件,但这些URL不会知道,直到我从已知URL获取一个JSON对象。我知道我必须为每个URL下载启动一堆线程(使用AsyncTask类)。

如何才能使执行JSON线程,首先完成了我有效地排队这些线程,这样我就可以使用来自该线程,当我后,立即火了那些50个图像线程检索到的数据?

回答

1

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

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

此外IIRC,有在HTTP规范中的一个限制,即一个可以只具有4(?)同步到一个远程服务器连接。因此,考虑排队映像加载请求并逐个获取它们。

+0

我使用AsyncTask检索图像(使用虚拟URL)。这工作正常。但我不确定如何组织这些线程,直到另一个AsyncTask线程检索该JSON对象时才基本不触发 – ZakTaccardi 2012-07-23 02:24:50

+0

它不仅仅是图像加载,它首先是DNS请求。尽管如此,四个线程和一个生产者 - 消费者队列肯定会比一个线程更快,并且在资源有限的移动设备中,限制4似乎是合理的开始。我可能会让它可配置,所以我可以轻松地尝试不同的线程池深度。 – 2012-07-23 03:53:51

2

不要启动50个线程。使用单个线程。虽然这应该与UI线程的响应性分开,但没有必要产生多个线程,并且每个URL肯定不会有一个线程。只需使您的JSON网络调用,然后解析响应,然后(在相同的线程)遍历请求每个URL的URL,并将结果解码为Bitmap。你可以将它们添加到你的GridView的适配器的模型对象中,它会自动触发GridView在UI线程上更新。

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

+1

因此,这是50个连续的DNS查找和50个连续的HTTP GET请求。为什么你说单线程是一个好方法,特别是考虑到无线链路的延迟? – 2012-07-23 03:48:34

+0

因为如果你并行启动50个请求,你的用户将在任何一个完成加载之前退出应用程序。 – 2012-07-23 11:24:46

+0

我基本上做沿着http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html 线的东西它不会做50一次,目前只是无论是在gridview。它工作正常。这不是问题 只要GridView中的网格元素尝试填充自己,就会创建一个新线程 – ZakTaccardi 2012-07-23 14:00:12