使用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的强引用,如下是不行的:
正确的姿势应该是将你的异步任务变成静态内部类,并且持有MyActivity的一个弱引用,当更新UI(即执行onPostExecute)的时候我们需要拿到activity的一个强引用,这个时候去判断activity的状态,是销毁了还是健在再去做处理,就避免了内存泄漏
3:广播接收者不要忘记解注册
4:观察者模式不要忘记deleteObserver(observer);
5:要注意静态变量,方法还有单例模式的生命周期是和Application一致的,此时要特别注意context的引用
先写这些,有的话再补充….
下图展示了一些场景我们该用哪种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的引用
先写这些,有的话再补充….
相关文章推荐
- 正确使用pthread_create,防止内存泄漏
- 如何使用AsyncTask防止内存泄漏(Handler同理)
- 正确使用pthread_create,防止内存泄漏
- Handler的正确使用,防止内存泄漏
- Fragment使用的正确姿势
- 安卓推送技术手册——使用透传消息的正确姿势
- 内存泄漏是新手必然要经历的痛,NSMutableArray的正确使用
- Android防止内存泄漏以及MAT的使用
- iPhone开发笔记[12/50]:内存泄漏是新手必然要经历的痛,NSMutableArray的正确使用
- FlowDroid在Ubuntu上正确使用姿势
- 新手与大神就在一念之间,论HTML5的正确使用姿势。创优翼教育
- 正确使用 SharePoint 对象模型避免内存泄漏
- Android开发必知--使用View.setId的正确姿势
- split 方法的正确使用姿势
- Windows 10 代理上网用户的正确使用姿势
- git 的正确使用姿势
- 内存泄漏是新手必然要经历的痛,NSMutableArray的正确使用
- 正确使用 SharePoint 对象模型避免内存泄漏
- 使用Flume Log4j Appender正确的姿势
- 使用正确的姿势更新SSIS Data Flow Component以适应字段类型变化