本文主要是介绍Android内存泄漏剖析之AsyncTask,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#泄漏原因
一个常见的内存泄漏错误是AsyncTask有Activity或者Fragment的的强引用。
##错误示例##
下面是错误的,因为内部类隐式的含有父类的引用,这种情况下,通常是Activity和Fragment的引用。
class MyActivity extends Activity {private AsyncTask<Void, Void, Void> myTask = new AsyncTask<Void, Void, Void>() {//}
}
这个问题的产生原因是因为AsyncTask的生命周期通常比Activity长,例如=当任务时候,一些配置改变了。
#正确的使用AsyncTask方式
- AsyncTask变为静态内部类
2.持有父类Activity或者Fragment的弱引用
##粗暴的代码##
class MyActivity extends Activity {static class MyTask extends AsyncTask<Void, Void, Void> {// 弱引用允许Activity被垃圾收集器清理private final WeakReference<MyActivity> weakActivity;MyTask(MyActivity myActivity) {this.weakActivity = new WeakReference<>(myActivity);}@Overridepublic Void doInBackground(Void... params) {// do async stuff here}@Overridepublic void onPostExecute(Void result) {// 重新获取Actiity的强引用,并且判断是否存活MyActivity activity = weakActivity.get();if (activity == null|| activity.isFinishing()|| activity.isDestroyed()) {// activity死亡了,不再做任何的事情return;}// The activity is still valid, do main-thread stuff here}}
}
这篇关于Android内存泄漏剖析之AsyncTask的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!