0

我正在制作一个必须执行大量后台操作的应用程序。

  • 一个接一个地从 30 个相似的 JSON 中下载数据。
  • 根据用户响应更改上述下载的优先级/顺序。
  • 根据用户请求并行下载多个图像
  • 停止线程/检查线程状态等。

哪个是执行上述操作的最佳类/API。我一直在使用AsyncTask,但我在某处读到它具有 10 个后台操作的默认限制,并且还超过了功能限制。

如果您能分享实现上述任务的代码,我也将不胜感激。

4

2 回答 2

2

你想使用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);

另请参阅:如何使用 ThreadPoolExecutor 和自定义任务实现 PriorityBlockingQueue

于 2012-11-05T10:52:50.720 回答
0

是的,线程池是一个很好的解决方案。但是为什么要自己做呢?我在 sourceforge.net 上管理一个开源项目,可以帮助你开始。我还写了这篇文章作为介绍:Managing Threads in Android

于 2012-11-05T14:03:10.070 回答