警告:不要将Android上下文类放置在静态字段中; 这是一个内存泄漏(也打破即时运行)

Android Studio:

不要将Android上下文类放置在静态字段中; 这是一个内存泄漏(也打破即时运行)

所以2个问题:

#1如何从不带静态variables的静态方法调用startService
#2如何从静态方法(相同)发送localBroadcast?

例子:

 public static void log(int iLogLevel, String sRequest, String sData) { if(iLogLevel > 0) { Intent intent = new Intent(mContext, LogService.class); intent.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW"); mContext.startService(intent); } } 

要么

  Intent intent = new Intent(MAIN_ACTIVITY_RECEIVER_INTENT); intent.putExtra(MAIN_ACTIVITY_REQUEST_FOR_UPDATE, sRequest)); intent.putExtra(MAIN_ACTIVITY_DATA_FOR_VIEW, sData); intent.putExtra(MAIN_ACTIVITY_LOG_LEVEL, iLogLevel); LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent); 

什么是正确的方法来做到这一点,而不使用mContext

注:我认为我的主要问题可能是如何将上下文传递给调用方法所在的类。

只需将其作为parameter passing给您的方法。 仅仅为了启动Intent而创buildContext的静态实例是没有意义的。

这是你的方法应该看起来如何:

 public static void log(int iLogLevel, String sRequest, String sData, Context ctx) { if(iLogLevel > 0) { Intent intent = new Intent(ctx, LogService.class); intent1.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW"); ctx.startService(intent); } } 

从关于问题的评论中更新:从启动活动(通过构造函数参数或方法参数)级联上下文直到您需要的点。

只要确保在任何通过方法/构造函数传入的上下文中传递context.getApplicationContext()或调用getApplicationContext()(如果决定将其存储在任何成员字段中)。

白痴certificate的例子(即使有人会通过一个活动,它会抓住应用程序上下文,并使用它来实例化单例):

 public static synchronized RestClient getInstance(Context context) { if (mInstance == null) { mInstance = new RestClient(context.getApplicationContext()); } return mInstance; } 

根据文档getApplicationContext(): “返回当前进程的单个全局应用程序对象的上下文。”

这意味着由“getApplicationContext()”返回的上下文将贯穿整个过程,因此,如果将静态引用存储到任何位置,则无关紧要,因为在应用程序的运行时期间,它始终存在于这个静态引用中(并且超出了任何对象/由它实例化的单例)。

将它与持有大量数据的视图/活动内的上下文进行比较,如果泄漏活动持有的上下文,系统将无法释放显然不好的资源。

根据上下文对活动的引用应该与活动本身的生命周期相同,否则会导致内存泄漏(这是lint警告背后的原因)。

编辑:对于从上面的文档抨击例子的家伙,甚至有关于我刚刚写的关于代码的评论部分:

  // getApplicationContext() is key, it keeps you from leaking the // Activity or BroadcastReceiver if someone passes one in. 

只是一个警告。 不要担心。但是如果你想使用应用程序上下文,你可以把它保存在“singleton”类中,该类用于保存项目中所有的singleton类。

在你的情况下,将它作为静态字段没有什么意义,但是我不认为它在所有情况下都是不好的。 如果你现在在做什么,你可以有静态字段有上下文,并在以后为空。 我正在创build我的主要模型类的静态实例,其中有上下文里面,其应用程序上下文而不是活动上下文,还有静态实例领域的类包含我在空摧毁的活动。 我没有看到我有内存泄漏。 所以如果一些聪明的人认为我错了,随时评论…

也即时运行在这里罚款…