AsyncTask的缺陷和注意事项

1. AsyncTask 主要是用来处理后台耗时操做,并将数据更新到主线程的一个工具类。app

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不该该由应用程序调用,开发者须要作的就是实现这些方法。 
  1) 子类化AsyncTask 
  2) 实现AsyncTask中定义的下面一个或几个方法 
     onPreExecute(), 该方法将在执行实际的后台操做前被UI thread调用。能够在该方法中作一些准备工做,如在界面上显示一个进度条。 
    doInBackground(Params...), 将在onPreExecute 方法执行后立刻执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工做。能够调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 
    onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展现任务的进展状况,例如经过一个进度条进行展现。 
    onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将经过该方法传递到UI thread.工具

 

为了正确的使用AsyncTask类,如下是几条必须遵照的准则: 
  1) Task的实例必须在UI thread中建立 
  2) execute方法必须在UI thread中调用 
  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法 
  4) 该task只能被执行一次,不然屡次调用时将会出现异常 
      doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。线程

 

2. Asynctask 存在的问题code

1) AsyncTasks的生命周期生命周期

Asynctask 的声明周期和他所在的activity 的生命周期不是一致的, 不少人认为当它生成AsyncTask的Activity终止了,AsyncTask也会终止,这实际上是一个误解。它会以它自有的方式继续运行,即便你退出了整个应用程序。AsyncTask提早结束的惟一方法是经过调用AsyncTask.cancel()进行取消。内存

这代表你必须亲自管理 AsyncTask的取消操做;不然,因为没必要要的后台线程会致使app阻塞的风险,或者内存泄露。当再也不须要一个AsyncTask时,必定要取消它,防止在app执行期间引发任何问题。开发

并且即便调用了cancel() , 也未必能真正地取消任务。由于若是在doInBackgroud里有一个不可中断的操做,好比BitmapFactory.decodeStream(),那么这个操做会继续下去。it

 

2)内存泄露thread

 

若是AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对建立了AsyncTask的Activity的引用。若是Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,致使Activity没法被回收,引发内存泄露。后台

 

3)结果丢失

屏幕旋转或Activity在后台被系统杀掉等状况会致使Activity的从新建立,以前运行的AsyncTask会持有一个以前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将再也不生效。

 4)并行仍是串行

Android 1.6以前的版本,AsyncTask是串行的,在1.6至2.3的版本,改为了并行的。在2.3以后的版本又作了修改,能够支持并行和串行,当想要串行执行时,直接执行execute()方法,若是须要并行执行,则要执行executeOnExecutor(Executor)。

相关文章
相关标签/搜索