【发布时间】:2015-08-25 13:24:19
【问题描述】:
我有一些需要上下文信息的单例,因为它们可能必须显示对话框。到目前为止,我已经将相关上下文传递给了单例,但这越来越多地导致内存泄漏。我想知道在应用程序类中存储对当前活动的引用是否可以解决这个问题。由于每次启动新活动时都会覆盖该变量,因此不会导致内存泄漏,但也可以从应用中的所有非活动类访问。
在我的应用程序类中:
private static Activity currentForegroundActivity;
public static void setCurrentlyVisibleActivity(Activity activity) {
currentForegroundActivity = activity;
}
public static Activity getCurrentlyVisibleActivity() {
return currentForegroundActivity;
}
在每个活动中:
@Override
public void onResume() {
super.onResume();
App.setCurrentlyVisibleActivity(this);
在每个单例中:
methodThatRequiresUI(App.getCurrentlyVisibleActivity);
您可以预见到这条路线上是否存在任何陷阱?我想应用程序类可能会被操作系统从内存中清除,但如果发生这种情况,应用程序本身会重新启动——它不会导致空指针。 get 方法也可能在调用 set 之前的应用程序启动期间被调用 - 但我可以编写检查来解决这个问题。
【问题讨论】:
-
不要存储对活动的引用(如果真的需要使用 WeekReference,但这也是个坏主意)。您可能需要在需要引用上下文的单例方法中再添加一个参数。
-
“我有几个单例...可能必须显示对话框”——这是一个错误,您应该修复它。
-
永远不要忘记保持简单愚蠢