android中的复杂线程

时间:2012-11-05 10:48:29

标签: android multithreading android-asynctask threadpool

我正在创建一个应用程序,我将执行大量后台操作。

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

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

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

2 个答案:

答案 0 :(得分: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限制(例如图形)活动的比例而异。

为了优先考虑队列中的条目,我建议你像http://www.javamex.com/tutorials/threads/thread_pools_queues.shtml一样创建自己的ThreadPoolExecutor,但是改为传递PriorityQueue:

BlockingQueue q = new PriorityQueue<Runnable>();
ThreadPoolExecutor ex = new ThreadPoolExecutor(4, 10, 20, TimeUnit.SECONDS, q);

另请参阅:How to implement PriorityBlockingQueue with ThreadPoolExecutor and custom tasks

答案 1 :(得分:0)

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