防止内存泄漏注意事项

1、Handler使用

privateMyHandler mHandler =newMyHandler(this);

//自定义静态内部类继承自Handler

privatestaticclassMyHandlerextendsHandler{

        privateWeakReference reference;

     //在构造函数中使用弱引用来引用context对象

       publicMyHandler(Context context){

        reference =newWeakReference<>(context);

  }

@Override

publicvoidhandleMessage(Message msg){

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

            if(activity !=null){

            activity.mTextView.setText("");

          }

   }

}

@Override

protectedvoidonDestroy(){

    super.onDestroy();

    //移除队列中所有的Runable和消息

    //这里也可以使用mHandler.removeMessage和mHandler.removeCallBacks来移除指定的Message和Runable

    mHandler.removeCallbacksAndMessages(null);

  }

2、单例的使用,如果单例中需要传入context或者activity

单例设计模式的静态特性会使他的生命周期和应用程序的生命周期一样长,这就说明了如果一个对象不在使用了,而这时单例对象还在持有该对象的引用,这时GC就会无法回收该对象,造成了内存泄露的情况。

1、如果我们传入的Context是Application的Context的话,就没有任何问题,因为Application的Context生命周期和应用程序生命周期一样长。

2、如果我们传入的Context是Activity的Context的话,这时如果我们因为需求销毁了该Activity的话,Context也会随着Activity被销毁,但是单例还在持有对该类对象的引用,这时就会造成内存泄漏。

public class AppManager { 

     private static AppManager instance;

     private Context context;

     private AppManager(Context context) { 

     this.context = context.getApplicationContext(); 

 } 

 public static AppManager getInstance(Context context) {

     if (instance != null) {

     instance = new AppManager(context);

    } 

     return instance; 

 } 

3、静态内部类的使用

这样就在Activity中创建了非静态内部类,非静态内部类默认持有Activity类的引用,但是他的生命周期还是和应用程序一样长,所以当Activity销毁时,静态内部类的对象引用不会被GC回收,就会造成了内存溢出,解决办法:

1、将内部类改为静态内部类。

2、将这个内部类封装成一个单例,Context使用Application的Context

4、资源未关闭,以及使用一些图片过大。

对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

5线程问题

线程造成:匿名内部类Runnalbe和AsyncTask对象执行异步任务,对当前Activity隐式引用。当Activity销毁之前,任务还没有执行完,将导致Activity的内存和资源不能及时回收;

 资源未关闭造成的内存泄露:对于使用了BroadcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄露;

 6webview问题

就是在销毁webview前一定要onDetachedFromWindow,我们先将webview从它的父view中移除再调用destroy方法,代码如下:

@Override

protected void onDestroy() {

  super.onDestroy();

  if (mWebView != null) {

      ViewParent parent = mWebView.getParent();

      if (parent != null) {

        ((ViewGroup) parent).removeView(mWebView);

      }

      mWebView.removeAllViews();

      mWebView.destroy();

      mWebView = null;

  }

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • OOM(OutOfMemory)就是我们平时所碰到的内存溢出,而内存泄漏的最终后果就是导致OOM。内存泄漏是造成应...
    闲庭阅读 1,324评论 0 9
  • 前言对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检...
    大表哥007阅读 287评论 0 1
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,711评论 0 8
  • 在android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导...
    m只为终点阅读 238评论 0 0
  • ###集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变...
    RunningTeemo阅读 637评论 0 0

友情链接更多精彩内容