文档章节

Android内存泄露处理

竹蜻蜓O_0纸飞机
 竹蜻蜓O_0纸飞机
发布于 2016/03/03 10:53
字数 520
阅读 18
收藏 1

看过一些大神分享的文章,吸取一些经验

1、处理Handler造成的内存泄露

创建一个静态Handler内部类,然后对Handler持有的对象使用弱引用,这样在回收时也可以回收Handler持有的对象,这样虽然避免了Activity泄漏,不过Looper线程的消息队列中还是可能会有待处理的消息,所以我们在Activity的Destroy时或者Stop时应该移除消息队列中的消息

public class MainActivity extends AppCompatActivity {

private MyHandler mHandler = new MyHandler(this);

private TextView mTextView;


private static class MyHandler extends Handler {

private WeakReference<Context> reference;


public MyHandler(Context context) {

        reference = new WeakReference<>(context);

        }


@Override

public void handleMessage(Message msg) {

MainActivity activity = (MainActivity) reference.get();

if (activity != null) {

activity.mTextView.setText("");

}

}

}


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mTextView = (TextView) findViewById(R.id.textview);

loadData();

}


private void loadData() {

// ...request

Message message = Message.obtain();

mHandler.sendMessage(message);

}


@Override

protected void onDestroy() {

super.onDestroy();

mHandler.removeCallbacksAndMessages(null);

}

}


2、线程造成的内存泄漏

static class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    private WeakReference<Context> weakReference;


    public MyAsyncTask(Context context) {

        weakReference = new WeakReference<>(context);

    }


    @Override

    protected Void doInBackground(Void... params) {

        SystemClock.sleep(10000);

        return null;

    }


    @Override

    protected void onPostExecute(Void aVoid) {

        super.onPostExecute(aVoid);

        MainActivity activity = (MainActivity) weakReference.get();

        if (activity != null) {

        //...

        }

    }

}

static class MyRunnable implements Runnable{

    @Override

    public void run() {

        SystemClock.sleep(10000);

    }

}

//——————

new Thread(new MyRunnable()).start();

new MyAsyncTask(this).execute();


一些建议

  1. 对于生命周期比Activity长的对象如果需要应该使用ApplicationContext

  2. 对于需要在静态内部类中使用非静态外部成员变量(如:Context、View ),可以在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏

  3. 对于不再需要使用的对象,显示的将其赋值为null,比如使用完Bitmap后先调用recycle(),再赋为null

  4. 保持对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期

  5. 对于生命周期比Activity长的内部类对象,并且内部类中使用了外部类的成员变量,可以这样做避免内存泄漏:

    1. 将内部类改为静态内部类

    2. 静态内部类中使用弱引用来引用外部类的成员变量

  6. 在涉及到Context时先考虑ApplicationContext


本文转载自:http://gold.xitu.io/entry/56d64b9e816dfa005943a55c?utm_source=leopost&utm_medium=20160302&utm_cam...

共有 人打赏支持
竹蜻蜓O_0纸飞机
粉丝 5
博文 15
码字总数 3339
作品 0
海淀
程序员
私信 提问
Android中使用Handler引发的内存泄露

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。 public class SampleActivity extends Activity { private final Handler mLeakyHandl...

geek_loser
2015/11/12
0
0
Android中的内部类引起的内存泄露

引子 什么是内部类?什么是内存泄露?为什么Android的内部类容易引起内存泄露?如何解决? 什么是内部类? 什么是内部类?什么又是外部类、匿名类、局部类、顶层类、嵌套类?大家可以参考我这...

SuShine
12/03
0
0
Android 中 Handler 引起的内存泄露

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。 1. public class SampleActivity extends Activity { 2. 3. private final Handler mL...

今晚打猴子
2015/08/06
221
2
Android Activity / Fragment内存泄露引论

 Android Activity / Fragment内存泄露引论 Android发生OOM(OutOfMemoryError)问题的重要因素是编程设计不佳的代码出现内存泄露(Leak)造成Android分配的内存紧张。关于内存泄漏的问题...

开开心心过
2017/10/19
0
0
Android context(Application/Activity)与内存泄露

android中的context可以做很多操作,但是最主要的功能是加载和访问资源。 在android中有两种context,一种是 application context,一种是activity context,通常我们在各种类和方法间传递的...

长平狐
2013/01/06
37
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机系统要素 C5

本章值得一提的是组织计算机的结构。Hack 的指令和数据是分开存储的,因此它的 CPU 有两个 input: IN inM[16], // M value input (M = contents of RAM[A]) instruction[16],...

lionets
16分钟前
0
0
SpringSecurity404需要注意的地方

在使用@RequestMapping的时候路径的值如果写为("auth"),虽然用的时候前面加不加"/"没有区别,但是在配置了SpringSecurity的http.authorizeRequests().antMatchers()时就必须要注意了! 🌰1...

百萬馬力
19分钟前
0
0
10分钟读懂阿里巴巴高级专家在Flutter Live2018的分享

作者:闲鱼技术-宗心 12月4日,google flutter团队宣布第一个flutter正式版本发布。次日,Flutter Live Beijing 会议上,google flutter团队邀请了在这一技术方案中重要的合作伙伴闲鱼团队分...

阿里云官方博客
20分钟前
1
0
RxJava window操作符

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/3.%20Sequences%20of%20coincidence.md Sequences of coincidence Rx试图避免管道(pipeline)外......

woshixin
27分钟前
1
0
05.Beetl标签函数以及定界符、占位符介绍---《Beetl视频课程》

本期视频实现了博客的详情页面; 内容简介:使用了标签函数layout完成详情功能 一起学beetl目录:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598 作者:GK #标签函数 layo...

Gavin-King
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部