AsyncTask不适合用作长时间任务处理

============================
AsyncTask适合做短任务,比如Http请求。不适合做长任务,比如下载大文件或后台进行图形计算等。

从下面3点来说:

  1. AsyncTask默认在整个APP中使用一个Executor,串行执行任务。

    在Application初始化过程中,使用单线程的Executor来运行AsyncTask,因此默认情况下,APP的所有AsyncTask.execute()方法都运行在单线程中,串行执行。即一个AsyncTask执行完后,另一个才能执行。如果想并行,需要调用AsyncTask.execute(executor)方法来自己定义Executor。

  2. AsyncTask与Activity、Fragment的生命周期方法没有绑定关系。

    在Activity或Fragment中定义了AsyncTask,当屏幕旋转或其他原因导致当前页面被销毁时,AsyncTask并没有停止。当AsyncTask完成任务后返回到UI线程更新UI时,就会抛出异常:java.lang.IllegalArgumentException:View notattached to window manager

  3. AsyncTask容易导致内存泄露。

    通常AsyncTask在Activity或Fragment中都是作为(匿名)内部类定义的,因此该内部类会隐式的持有外部类(Activity/Fragment)的引用。当执行长任务时,Activity被销毁的情况下,AsyncTask也不会停止,同时AsyncTask隐式的持有Activity的引用,导致Activity的内存无法被释放,就造成了内存泄露。

所以,不推荐用AsyncTask执行长任务。

参考文章:Android AsyncTask for Long Running Operations

============================
原创,转载请指明出处(http://blog.xinspace.xin)。