您的位置:首页 > 其它

使用AsyncTask防止Memory Leaks(内存泄漏)的正确姿势

2017-01-06 16:56 405 查看
1:合理的使用context–比如我们常使用的Toast,Service,最好使用getApplicationContext(),因为这些在activity结束的时候可能仍在运行

下图展示了一些场景我们该用哪种context(图是盗的,附原文地址https://possiblemobile.com/2013/06/context/ 是国外的大牛写的关于context的使用)



2:不要在activity中使用AsyncTask的强引用,如下是不行的:

class MyActivity extends Activity {
private AsyncTask<Void, Void, Void> myTask = new AsyncTask<Void, Void, Void>() {
//内部类隐含了对activity的一个强引用,强引用是无法被gc回收的;
}
}


正确的姿势应该是将你的异步任务变成静态内部类,并且持有MyActivity的一个弱引用,当更新UI(即执行onPostExecute)的时候我们需要拿到activity的一个强引用,这个时候去判断activity的状态,是销毁了还是健在再去做处理,就避免了内存泄漏

class MyActivity extends Activity {
static class MyTask extends AsyncTask<Void, Void, Void> {
// 弱引用是允许被gc回收的;
private final WeakReference<MyActivity> weakActivity;

MyTask(MyActivity myActivity) {
this.weakActivity = new WeakReference<>(myActivity);
}

@Override
public
4000
Void doInBackground(Void... params) {
// do async stuff here
}

@Override
public void onPostExecute(Void result) {

MyActivity activity = weakActivity.get();
if (activity == null
|| activity.isFinishing()
|| activity.isDestroyed()) {
// activity没了,就结束可以了
return;
}

// 继续更新ui
}
}
}


3:广播接收者不要忘记解注册

4:观察者模式不要忘记deleteObserver(observer);

5:要注意静态变量,方法还有单例模式的生命周期是和Application一致的,此时要特别注意context的引用

先写这些,有的话再补充….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: