摘要:本文将带你了解Android应用开发Android内存泄漏问题,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android内存泄漏问题,希望本文对大家学Android有所帮助。
<
1,静态变量导致的内存泄漏
在dalvik虚拟机中,static变量所指向的内存引用,如果不把它设置为null,GC【garbage collection
】是永远不会回收这个对象的,所以会导致这个activity无法正常销毁:
public class MainActivity extends Activity{ private static Context mContext; @ovveride proteced void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this;}}
那么怎么解决呢,将 mContext赋为 null 就可以了。
public class MainActivity extends Activity{ private static Context mContext; @override proteced void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; } @override proteced void onDestroy() super.onDestroy(); if(mContext != null){ mContext = null; } }
2,单例模式导致的内存泄漏
下面提供一个单例模式的类:
public class SingleInstanceF { private static SingleInstanceF single; private Context context; private SingleInstanceF(Context context){ this.context = context; } public static SingleInstanceF getInstance(Context context){ if(single==null){ single = new SingleInstanceF(context); } return single; } }
接着来使用这个单例模式:
public class TestActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SingleInstanceF instanceF = SingleInstanceF.getInstance(this); } }
TestActivity对象被单利模式所引用,同样当退出activity时activity得不到释放。
解决方法:在onDestroy()将instance赋值为null。或者将参数 this 换成 application context。
3,属性动画造成的内存泄漏
public class MainActivity extends Activity{ ObjectAnimator animator; Button mButton; @override proteced void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = findViewById(R.id.button1); animator = ObjectAnimator.ofFloat(mButton, "rotation", 0, 360).setDuration(2000); animator.setRepeatCount(ValueAnimator.INFINITE); animator.start(); }}
因为动画在无限循环,如果在Activity中播放这个动画并且没有在onDestroy中去停止这个动画,那么动画会一直播放下去
,尽管无法在界面上看到动画效果了,并且这个时候Activity的View会被动画持有,而View又持有 Activity,最终Activity
无法释放。解决方法,在onDestroy中调用 animator.cancle()来停止动画:
public class MainActivity extends Activity{ ObjectAnimator animator; Button mButton; @override proteced void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = findViewById(R.id.button1); animator = ObjectAnimator.ofFloat(mButton, "rotation", 0, 360).setDuration(2000); animator.setRepeatCount(ValueAnimator.INFINITE); animator.start(); } @override void onDestroy(){ super.onDestroy(); animator.cancle(); }
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号