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

Android线程-在执行所有其他线程之前先执行一个线程,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,我是Android编程新手,有一个线程问题 我基本上是用来自50个左右URL的图像填充GridView,但这些URL在我从已知URL检索JSON对象之前是未知的。我知道每次URL下载都需要启动一堆线程(使用AsyncTask类) 如何有效地对这些线程进行排队,以便首先执行并完成JSON线程,这样我就可以在紧接着启动这50个映像线程时使用从该线程检索到的数据了?好吧,您可以运行第一次抓取,完成后,从该主线程启动50个线程。由于Android 3.0及更高版本会在您从UI线程进行网络通信时终止您的应

我是Android编程新手,有一个线程问题

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


如何有效地对这些线程进行排队,以便首先执行并完成JSON线程,这样我就可以在紧接着启动这50个映像线程时使用从该线程检索到的数据了?

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

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


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

不要启动50个线程。使用一根线。虽然为了响应,这应该与UI线程分开,但不需要产生多个线程,当然每个URL.ce不需要一个线程

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


这里有更好的实践,例如延迟加载、缓存和在加载图像时显示占位符图像,但是具体的实现变得太复杂,无法在这里描述。搜索WeakReferenceMap和LruCache,找到动态图像加载到AdapterView的最佳实践示例。

我正在使用AsyncTask检索图像(使用虚拟URL)。那很好。但我不确定如何组织这些线程,使其在另一个AsyncTask线程检索到JSON对象之前基本上不会启动。这不仅仅是图像加载,而是DNS请求。尽管如此,四个线程和一个生产者-消费者队列肯定比一个线程快,在资源有限的移动设备中,限制4似乎是一个合理的开始。我可能会将其配置为可以轻松尝试不同的线程池深度。因此,这是50个顺序DNS查找和50个顺序HTTP GET请求。为什么你说单线程是一个好方法,特别是考虑到无线链接的延迟?因为如果你同时启动50个请求,你的用户将在任何一个请求完成加载之前退出应用程序。我基本上是在做一些事情,它不会一次执行50个请求,只是gridview中当前的任何请求。它很好用。这不是问题,只要gridview中的网格元素尝试填充,就会创建一个新线程itself@MarkRenouf-为什么?多个并发DNS查找等在桌面应用程序上正常工作。有什么问题吗?