Android开发:异步任务AsyncTask源码解析
android开发:AsyncTask实现并发执行异步任务
AsyncTask虽然能够帮助我们执行异步操作,但是AsyncTask本身存在很多糟糕的问题,如果使用中不注意,将会影响程序的健壮性。以至于现在使用的几率已经很少。
1、生命周期
AsyncTask
的生命周期不会和Activity
的生命周期随着销毁而销毁,它会一直执行,
直到doInBackground()
方法执行完毕。如果cancel(boolean)
被调用, 那么onCancelled(Result result)
方法会被执行;否则,执行onPostExecute(Result result)
方法。如果我们的Activity
销毁之前,没有停止AsyncTask
,这有可能让我们的AsyncTask
崩溃(crash)。因为它想要处理的view
已经不存在了。所以,我们总是必须确保在销毁活动之前取消任务。总之,我们使用AsyncTask
需要确保AsyncTask
正确地取消。
2、内存泄漏
如果
AsyncTask
被声明为Activity
的非静态的内部类(内部类会隐式持有外部类的引用),那么AsyncTask
会保留一个对创建了AsyncTask
的Activity
的引用。如果Activity
已经被销毁,AsyncTask
的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity
无法被回收,引起内存泄露。
3、结果丢失
横屏会导致
activity
被销毁创建,之前运行的AsyncTask
会持有一个之前Activity
的引用,这个引用已经无效,这时调用onPostExecute()
再去更新界面将不再生效。