我们在Android开发的过程中经常会用到Context,比如自定义一个Toast工具类,里面封装了连续点击不会重复弹出Toast的功能,当调用这个工具类时传入Activity的Context就有可能引起内存泄漏。

一、Context引起内存泄漏的原因
我们在Android开发的过程中经常会用到Context,比如自定义一个Toast工具类,里面封装了连续点击不会重复弹出Toast的功能,当调用这个工具类时传入Activity的Context就有可能引起内存泄漏。
具体原因通过一个例子来分析:
private static Toast sToast;public static void show(Context context, String text) {if (sToast == null) {sToast = Toast.makeText(context, text, Toast.LENGTH_SHORT);} else {sToast.setText(text);}sToast.setGravity(Gravity.CENTER, 0, 0);sToast.show();}private static Toast sToast; public static void show(Context context, String text) { if (sToast == null) { sToast = Toast.makeText(context, text, Toast.LENGTH_SHORT); } else { sToast.setText(text); } sToast.setGravity(Gravity.CENTER, 0, 0); sToast.show(); }private static Toast sToast; public static void show(Context context, String text) { if (sToast == null) { sToast = Toast.makeText(context, text, Toast.LENGTH_SHORT); } else { sToast.setText(text); } sToast.setGravity(Gravity.CENTER, 0, 0); sToast.show(); }
以上写法当在Activity中调用时可能会引起Activity的内存泄漏
MToast.show(this, “安卓梦雪”);
这是因为sToast对象是静态的,因此它的生命周期与Application一样长,当Activity被销毁后,Activity的实例仍然被sToast持有,导致Activity无法被GC回收从而引起内存泄漏。
二、解决Context引起的内存泄漏
既然我们已经知道了Context引起内存泄漏的原因,那么我们就可以对症下药来解决这个问题。
private static Toast sToast;public static void show(Context context, String text) {if (sToast == null) {sToast = Toast.makeText(context.getApplicationContext(), text, Toast.LENGTH_SHORT);} else {sToast.setText(text);}sToast.setGravity(Gravity.CENTER, 0, 0);sToast.show();}private static Toast sToast; public static void show(Context context, String text) { if (sToast == null) { sToast = Toast.makeText(context.getApplicationContext(), text, Toast.LENGTH_SHORT); } else { sToast.setText(text); } sToast.setGravity(Gravity.CENTER, 0, 0); sToast.show(); }private static Toast sToast; public static void show(Context context, String text) { if (sToast == null) { sToast = Toast.makeText(context.getApplicationContext(), text, Toast.LENGTH_SHORT); } else { sToast.setText(text); } sToast.setGravity(Gravity.CENTER, 0, 0); sToast.show(); }
这里我们修改成了使用getApplicationContext()去弹出Toast,因为getApplicationContext()返回的对象是Application的Context,而Application的生命周期和整个应用是一样的,应用启动后Application被创建,整个应用退出后Application被摧毁。所以Application的Context的生命周期就是整个应用的生命周期。使用Application的Context就不会引起内存泄漏了。
THE END
用户38599038 8个月前0
还会更新吗用户42327002 8个月前0
解压密码是多少啊用户67068886 8个月前4
nb确实nb就是哥可以换一个网盘嘛网速限制😂太恶心了kk牛波一12个月前7
必须支持,太给力了帕格劳劳12个月前0
真不错!点赞点赞!一位 WordPress 评论者1年前0
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。