首页 > 系统 > Android > 正文

Android内存泄漏剖析之AsyncTask

2019-11-09 15:01:35
字体:
来源:转载
供稿:网友

泄漏原因

一个常见的内存泄漏错误是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); } @Override public Void doInBackground(Void... params) { // do async stuff here } @Override public 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 } }}

帮朋友招聘职位如下

普照天星【java开发工程师】20-30k http://www.jianshu.com/p/8b52751360df 产品经理20-30k http://www.jianshu.com/p/cb0ac7a00796

我的微信二维码如下

这里写图片描述

微信订阅号二维码如下:

这里写图片描述


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表