用于长时间运行操作的Android异步任务

用于长时间运行操作的Android异步任务,android,android-asynctask,Android,Android Asynctask,引用找到的AsyncTask的文档,它说: AsyncTasks最好用于短期操作(最多几秒钟)。如果您需要让线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,如Executor、ThreadPoolExecutor和FutureTask 现在我的问题出现了:为什么?doInBackground()函数在UI线程外运行,因此在这里长时间运行操作有什么危害 Aysnc任务是专门的线程,它仍将与应用程序GUI一起使用,但同时保留UI线程的资源繁重任

引用找到的AsyncTask的文档,它说:

AsyncTasks最好用于短期操作(最多几秒钟)。如果您需要让线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,如Executor、ThreadPoolExecutor和FutureTask


现在我的问题出现了:为什么?
doInBackground()
函数在UI线程外运行,因此在这里长时间运行操作有什么危害

Aysnc任务是专门的线程,它仍将与应用程序GUI一起使用,但同时保留UI线程的资源繁重任务。因此,当更新列表、更改视图等需要执行一些获取操作或更新操作时,您应该使用异步任务,这样您就可以使这些操作远离UI线程,但请注意,这些操作仍然以某种方式连接到UI

对于不需要UI更新的长时间运行的任务,您可以使用服务,因为它们甚至可以在没有UI的情况下生存

因此,对于短任务,请使用异步任务,因为它们可能在生成活动结束后被操作系统杀死(通常不会在操作过程中结束,但会完成其任务)。对于长时间重复的任务,使用服务代替

有关更多信息,请参见线程:


Aysnc任务是专门的线程,它仍将与应用程序GUI一起使用,但同时保留UI线程的资源繁重任务。因此,当更新列表、更改视图等需要执行一些获取操作或更新操作时,您应该使用异步任务,这样您就可以使这些操作远离UI线程,但请注意,这些操作仍然以某种方式连接到UI

对于不需要UI更新的长时间运行的任务,您可以使用服务,因为它们甚至可以在没有UI的情况下生存

因此,对于短任务,请使用异步任务,因为它们可能在生成活动结束后被操作系统杀死(通常不会在操作过程中结束,但会完成其任务)。对于长时间重复的任务,使用服务代替

有关更多信息,请参见线程:

为什么?

因为默认情况下,
AsyncTask
使用的线程池不是您创建的。永远不要占用您未创建的池中的资源,因为您不知道该池的需求是什么。而且,如果某个池的文档告诉您不要这样做,那么千万不要占用您未创建的池中的资源,这里就是这种情况

特别是,从Android 3.2开始,默认情况下
AsyncTask
使用的线程池(对于
Android:targetSdkVersion
设置为13或更高版本的应用程序)中只有一个线程——如果无限期地绑定此线程,则其他任务都不会运行

为什么?

因为默认情况下,
AsyncTask
使用的线程池不是您创建的。永远不要占用您未创建的池中的资源,因为您不知道该池的需求是什么。而且,如果某个池的文档告诉您不要这样做,那么千万不要占用您未创建的池中的资源,这里就是这种情况


特别是,从Android 3.2开始,默认情况下,
AsyncTask
使用的线程池(适用于
Android:targetSdkVersion
设置为13或更高版本的应用程序)中只有一个线程——如果无限期地绑定此线程,则其他任务都不会运行。

这是一个非常好的问题,作为一名Android程序员,完全理解这个问题需要时间。实际上,AsyncTask有两个相关的主要问题:

  • 它们与活动生命周期的联系很差
  • 它们很容易造成内存泄漏
在应用程序()中,我们详细回答了这个问题。它将深入介绍异步任务、加载程序及其特性和缺点,并向您介绍另一种网络请求解决方案:RoboSpice。 网络请求是Android中的常见需求,本质上是长时间运行的操作 . 以下是该应用程序的摘录:

异步任务和活动生命周期 异步任务不遵循活动实例的生命周期。如果在活动内启动异步任务并旋转设备,则该活动将被销毁并创建新实例。但这项任务不会消亡。它将继续生存,直到它完成。

当它完成时,AsyncTask不会更新新活动的UI。实际上,它更新了活动的前一个实例 不再显示。这可能导致java.lang.IllegalArgumentException类型的异常:如果 例如,使用findViewById检索活动内部的视图。

内存泄漏问题 将异步任务创建为活动的内部类非常方便。因为AsyncTask将需要操纵视图 当任务完成或正在进行时,使用活动的内部类似乎很方便:内部类可以 直接访问外部类的任何字段。

然而,这意味着内部类将在其外部类实例上持有一个不可见的引用:活动。

从长远来看,这会产生内存泄漏:如果AsyncTask持续很长时间,它会使活动保持“活动状态” 而安卓希望摆脱它,因为它不能再显示了。活动不能被垃圾收集,这是一个中心问题 Android在设备上保留资源的机制。


在长时间运行的操作中使用AsyncTasks确实是一个非常糟糕的主意。尽管如此,对于短时间的视图(例如在1或2秒钟后更新视图)来说,它们还是可以的

我鼓励您下载,它真正深入地解释了这一点,并提供了示例和演示