android静态类保存context,Android开发 静态static类与static方法持有Context是否导致内存泄露的疑问...

简述

在Android开发的过程中,难免会使用单例模式或者静态方法工具类.我们会让它们持有一些外部的Context或者View一般有以下几种情况:

单例模式,类的全局变量持有Context 或 View (注意!持有View和持有Context其实是一样的) ----->此方式会内存泄露

单例模式,方法引入Context  ----->此方式不会内存泄露

工具类静态方法持有Context 或 View

工具类静态变量持有Context 或 View

上面我已经说明了会内存泄露的情况,我们就来逐一详细说明下如何操作,和证明他们是否会内存泄露

Context的类型认识

在讲解关于静态持有Context之前,我们需要来认识一下Context自己的区别,原则上Context其实只有2种(尽管Activity/Fragment/Service/都有Context,但是实际上他们属于一个类型的Context)

第一种

应用的Context,下面的2行代码都是调用应用的Context,这个Context在一个app里只会有一个.并且在App启动时创建,App关闭时消亡,所以这个Context是贯彻App生命周期全程的.

Context applicationContext =getApplicationContext();

Context baseContext= getBaseContext();

第二种

Activity 或者 Service 自己,Activity 或 Service自己本身就是Context,这种Context的生命周期只在Activity或Service的生命周期下,关闭了Activity后Context理所应当的也随着消亡.有多少Activity和Service就会有多少个Context,并且重复多次创建某个Activity的时候Context也是多个

单例模式持有Context的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android SDK下, 如何在程序中输出日志 以及如何查看日志. 闲话少说,直接进入正题 在程序中输出日志, 使用 android.util.Log . 该提供了若干静态方法 Log.v(String tag, String msg); Log.d(String tag, String msg); Log.i(String tag, String msg); Log.w(String tag, String msg); Log.e(String tag, String msg); 分别对应 Verbose, Debug, Info, Warning,Error. tag是一个标识,可以是任意字符串,通常可以使用名+方法名, 主要是用来在查看日志时提供一个筛选条件. 程序运行后 并不会在 ide的控制台内输出任何信息. 如果要后查看日志 请使用 adb logcat 关于adb的更多信息请查看官方网站. 当执行 adb logcat 后会以tail方式实时显示出所有的日志信息. 这时候我们通常需要对信息进行过滤,来显示我们需要的信息, 这时候我们指定的 tag就派上了用场. adb logcat -s MyAndroid:I 这时将只显示tag为MyAndroid,级别为I或级别高于I(Warning,Error)的日志信息. 示例代码如下: Java代码 1. package com.zijun; 2. 3. import android.app.Activity; 4. import android.content.Context; 5. import android.graphics.Canvas; 6. import android.os.Bundle; 7. import android.util.Log; 8. import android.view.MotionEvent; 9. import android.view.View; 10. 11. public class MyAndroid extends Activity { 12. 13. protected static final String ACTIVITY_TAG="MyAndroid"; 14. 15. @Override 16. protected void onCreate(Bundle icicle) { 17. super.onCreate(icicle); 18. setContentView(new MyView(this)); 19. } 20. public class MyView extends View { 21. public MyView(Context c) { 22. super(c); 23. } 24. @Override 25. protected void onDraw(Canvas canvas) { 26. 27. } 28. @Override 29. public boolean onMotionEvent(MotionEvent event) { 30. Log.i(MyAndroid.ACTIVITY_TAG, "============================="); 31. 32. Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. "); 33. Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. "); 34. Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. "); 35. 36. return true; 37. } 38.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值