我正在制作一个必须执行大量后台操作的应用程序。
- 一个接一个地从 30 个相似的 JSON 中下载数据。
- 根据用户响应更改上述下载的优先级/顺序。
- 根据用户请求并行下载多个图像
- 停止线程/检查线程状态等。
哪个是执行上述操作的最佳类/API。我一直在使用AsyncTask
,但我在某处读到它具有 10 个后台操作的默认限制,并且还超过了功能限制。
如果您能分享实现上述任务的代码,我也将不胜感激。
我正在制作一个必须执行大量后台操作的应用程序。
哪个是执行上述操作的最佳类/API。我一直在使用AsyncTask
,但我在某处读到它具有 10 个后台操作的默认限制,并且还超过了功能限制。
如果您能分享实现上述任务的代码,我也将不胜感激。
你想使用ThreadPool s
ThreadPool 是一组托管线程,等待并行执行一组放在队列中的分配任务。
Java 提供了许多管理池的方法,从简单的固定大小的池到根据工作负载动态增长以最大化效率的池。
一个典型的模式是使用线程池来处理 android 不希望你在 UI 线程上执行的所有任务(例如:网络操作)。但是,大多数情况下,您的线程将需要在 UI 上发布结果——这在 UI 线程之外是被阻止的。这是您创建线程池的方式:
ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
threadExecutor.execute(new Runnable(){
public void run(){
//put here your network code
//when you get the result, either use
//view.post(new Runnable...);
//or
//AsynchTask
}
});
根据您的需要,您可以有多个线程池用于不同的目的,但总的来说,对于 Android,最好将活动线程的总数保持在较低水平。
根据您的硬件,建议每个内核 2 个线程,但这可能会根据 IO 绑定(例如网络)和 CPU 绑定(例如图形)活动的比例而有所不同。
为了优先考虑队列中的条目,我建议您创建自己的 ThreadPoolExecutor,如http://www.javamex.com/tutorials/threads/thread_pools_queues.shtml但传递 PriorityQueue 代替:
BlockingQueue q = new PriorityQueue<Runnable>();
ThreadPoolExecutor ex = new ThreadPoolExecutor(4, 10, 20, TimeUnit.SECONDS, q);
是的,线程池是一个很好的解决方案。但是为什么要自己做呢?我在 sourceforge.net 上管理一个开源项目,可以帮助你开始。我还写了这篇文章作为介绍:Managing Threads in Android