Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中复杂的线程_Android_Multithreading_Android Asynctask_Threadpool - Fatal编程技术网

android中复杂的线程

android中复杂的线程,android,multithreading,android-asynctask,threadpool,Android,Multithreading,Android Asynctask,Threadpool,我正在制作一个应用程序,我需要执行很多后台操作 从30个类似的JSON中逐个下载数据 根据用户响应更改上述下载的优先级/顺序 根据用户请求并行下载多个图像 停止线程/检查线程状态等 哪个类/API是执行上述操作的最佳类/API。我一直在使用AsyncTask,但我在某个地方读到,它的默认限制为10个后台操作,并且还超过了功能限制 如果您能分享实现上述任务的代码,我将不胜感激。您想使用 线程池是一组托管线程,等待并行执行队列中的一组分配任务 Java提供了许多管理池的方法,从简单的固定大小的池

我正在制作一个应用程序,我需要执行很多后台操作

  • 从30个类似的JSON中逐个下载数据
  • 根据用户响应更改上述下载的优先级/顺序
  • 根据用户请求并行下载多个图像
  • 停止线程/检查线程状态等
哪个类/API是执行上述操作的最佳类/API。我一直在使用
AsyncTask
,但我在某个地方读到,它的默认限制为10个后台操作,并且还超过了功能限制

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

您想使用

线程池是一组托管线程,等待并行执行队列中的一组分配任务

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,如中所示,但要传递PriorityQueue:

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

另请参见:

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

您可以共享一段代码来重新排序线程池中的优先级吗。有没有办法将线程池绑定到AsyncTask?如果您关心的是与UI交互,那么您的每个线程都可以向UI提交一个AsyncHthThread-UI本身就是一个线程池(但您无法控制它)。@GauravTheNewwGeek,请检查。非常感谢您的好友。还有一件事,如何根据用户的响应更改线程的优先级/顺序。