【第22期】观点:IT 行业加班,到底有没有价值?

内存——静态变量导致内存泄漏

转载 2016年08月29日 13:54:18

转自http://blog.csdn.net/u012810020/article/details/51726699

1、要不怎么说static关键字要慎用呢?来看看下面这段代码,Context对象为静态的,那么Activity就无法正常销毁,会常驻内存。

    public class MainActivity extends Activity{  
        public static Context mContext;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            mContext = this;  
        }  
    }  
解决办法:1使用Application的Context。 2慎用statistic关键字


2、单例模式导致内存的泄漏

静态变量导致的内存泄漏太过明显,而单例模式带来的内存的泄漏容易被忽略。

    **  
     * Created by lizhenya.  
     */  
    public class DensityConvertUtils {  
        private DensityConvertUtils() {  
            /* cannot be instantiated */  
            throw new UnsupportedOperationException("cannot be instantiated");  
        }  
      
        /**  
         * dp转px  
         *  
         * @param context  
         * @param dpVal  
         * @return  
         */  
        public static int dp2px(Context context, float dpVal) {  
            return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,  
                    dpVal, context.getResources().getDisplayMetrics());  
        }  
      
        /**  
         * sp转px  
         *  
         * @param context  
         * @param spVal  
         * @return  
         */  
        public static int sp2px(Context context, float spVal) {  
            return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,  
                    spVal, context.getResources().getDisplayMetrics());  
        }  
    }  

我们在使用的时候经常会犯一些错误:

    /**  
     * Created by lizhenya.  
     */  
    public class HomeActivity extends Activity {  
        Button btn_home;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            requestWindowFeature(Window.FEATURE_NO_TITLE);  
            setContentView(R.layout.layout_home);  
            DensityConvertUtils.dp2px(HomeActivity.this,20);  
        }  
    }  
单例模式的特点就是它的生命周期和Application一样,那么如果某个Activity实例被一个单例所持有,也就是说在单例里面引用了它,那么就会造成Activity对象无法正常回收释放。所以我们尽量的使用Application的全局Context。


3,属性动画导致的内存泄漏

    从Android3.0开始,Google提供了属性动画,属性动画中有一类无限循环的动画,如果在Activity中播放此类动画并且在onDestroy()方法中没有停止该动画,那么动画会一直循环下去,尽管在界面上已经无法看不到动画了,但这个时候Activity的View会被动画持有,而View又持有Activity,最终Activity无法释放。下面的动画是无限循环的,会泄露当前的Activity。

    /**  
     * Created by lizhenya.  
     */  
    public class HomeActivity extends Activity {  
        Button btn_home;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            requestWindowFeature(Window.FEATURE_NO_TITLE);  
            setContentView(R.layout.layout_home);  
            btn_home = (Button) findViewById(R.id.btn_home);  
            ObjectAnimator animator = ObjectAnimator.ofFloat(btn_home, "ratation", 0, 360).setDuration(2000);  
            animator.setRepeatCount(ValueAnimator.INFINITE);  
            animator.start();  
        }  
    }  

解决方案:

    在当前Activity的onDestroy()方法中取消动画:animator.cancel()。

    /**  
     * Created by lizhenya.  
     */  
    public class HomeActivity extends Activity {  
        private Button btn_home;  
        private ObjectAnimator animator;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            requestWindowFeature(Window.FEATURE_NO_TITLE);  
            setContentView(R.layout.layout_home);  
            btn_home = (Button) findViewById(R.id.btn_home);  
      
            animator = ObjectAnimator.ofFloat(btn_home, "ratation", 0, 360).setDuration(2000);  
            animator.setRepeatCount(ValueAnimator.INFINITE);  
            animator.start();  
        }  
      
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            animator.cancel();  
        }  
    }  




举报

相关文章推荐

android中不小心使用静态变量会导致内存泄露

在android 项目开发过程中,不小心可能就会导致activity的内存泄露,即使用户在使用APP的时候并没有感受到内存泄露给APP带来毁灭性的奔溃,但我们开发者可以通过调试能够很明显的看到有些占用...
  • wuchuy
  • wuchuy
  • 2016-04-25 15:39
  • 2300

内存泄漏优化---静态变量导致内存泄漏

1、要不怎么说static关键字要慎用呢?来看看下面这段代码,Context对象为静态的,那么Activity就无法正常销毁,会常驻内存。 public class MainActivity ext...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

[转载]高性能JAVA开发之内存管理

这几天在找一个程序的bug,主要是java虚拟机内存溢出的问题,调研了一些java内存管理的资料,现整理如下: 一、JVM中的对象生命周期 对象的生命周期一般分为7个阶段:创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段。 创建阶段,首先大家看一下,如下...

Android 内存泄漏总结——云栖社区

文章来源:https://yq.aliyun.com/articles/3009 摘要: Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的...

再谈Java内存泄漏及代码完善

尽管java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况.的确,在大型工程中,内存泄漏是一个普遍问题.避免内存泄漏的第一步,就是要了解他们发生的原因.这篇文章就是要介绍一些常见的缺陷,然后提供一些非常好的实践例子来指导你写出没有内存泄漏的代码.一旦你的程...

Android开发——常见的内存泄漏以及解决方案(一)

0. 前言  Android的内存泄漏是Android开发领域永恒的话题,那今天就总结一下常见的内存泄漏吧。也给自己提个醒,在以后的编码过程中多注意这个问题。在Android Studio里可以通过一...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)