我正在创建一个应用程序,我将执行大量后台操作。
哪个是执行上述操作的最佳类/ API。我一直在使用AsyncTask
,但我在某处读到它有10个后台操作的默认限制,也超出了功能限制。
如果您能够分享实现上述任务的代码和平,我将不胜感激。
答案 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