AsyncTask的注意事项

1.AsyncTask是串行的

  在android 1.6之前

2.同时最多只能执行5个

  android 1.6~2.3:改成了并行的.

  从1.6开始,AsyncTask引入了线程池,支持同时执行5个异步任务,也就是说同时只能有5个线程运行,超过的线程只能等待,等待前面的线程某个执行完了才被调度和运行。换句话说,如果一个进程中的AsyncTask实例个数超过5个,那么假如前5个都运行很长时间的话,那么第6个只能等待机会了。这是AsyncTask的一个限制,而且对于2.3以前的版本无法解决。如果你的应用需要大量的后台线程去执行任务,那么你只能放弃使用AsyncTask,自己创建线程池来管理Thread。不得不说,虽然AsyncTask较Thread使用起来方便,但是它最多只能同时运行5个线程,这也大大局限了它的实力,你必须要小心设计你的应用,错开使用AsyncTask的时间,尽力做到分时,或者保证数量不会大于5个.

3.默认串行,但支持并行

  android 2.3以后:

  串行执行:使用默认的线程池时,调用task.execute()

  并行执行:可以使用其它线程池,调用task.executeOnExecutor(Executor),参数是个线程池。

  如:

     AsyncTask<String,String,Void> task = new AsyncTask<String, String, Void>() {
@Override
protected Void doInBackground(String... params) {
return null;
}
};
//...
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

4.不要忘记cancel

  很多开发者会认为一个在Activity中创建的AsyncTask会随着Activity的销毁而销毁。然而事实并非如此。AsyncTask会一直执行,直到doInBackground()方法执行完毕。然后,如果cancel(boolean)被调用,那么onCancelled(Result result)方法会被执行;否则,执行onPostExecute(Result result)方法。如果我们的Activity销毁之前,没有取消AsyncTask,这有可能让我们的AsyncTask崩溃(crash)。因为它想要处理的view已经不在了。所以,我们总是必须确保在销毁活动之前取消任务。总之,我们使用AsyncTask需要确保AsyncTask正确的取消。

5.内存泄漏

  如果AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄漏。

6.结果丢失

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

 
上一篇:JS获取标签方法及兼容处理


下一篇:使用EF自带的EntityState枚举和自定义枚举实现单个和多个实体的增删改查