java - 应用程序返回内存时单例不可用

标签 java android singleton

我面临的问题如下:当我启动我的应用程序时,所有单例都在主要 Activity 中进行了初始化,并且一切都按预期工作。然后,如果我按下主页按钮并快速返回应用程序,一切正常,我认为这是因为一切都在内存中,但如果我去 chrome 观看几个视频或开始游戏并尝试返回我的应用程序,我得到一个异常(exception)。我不明白应用程序的这种状态,因为它没有被杀死但它不在内存中并且它试图回到按下主页按钮之前的 Activity ,调用 onCreate 方法并且我收到调用 Activity 的 Intent首先,但单例未初始化,异常发生在这里:

 Tracker tracker = GoogleAnalytics.getInstance(this).getDefaultTracker();
 tracker.set(Fields.SCREEN_NAME, "My View");
 tracker.send(MapBuilder
                    .createAppView()
                    .build()
    );

我尝试过的一种可能的解决方案是检查跟踪器,如果它为空,则创建一个新的并设置它:

if(tracker == null){
        tracker = GoogleAnalytics.getInstance(this).getTracker(trackerId);
        GoogleAnalytics.getInstance(this).setDefaultTracker(tracker);
}

但是我在另一个单例中得到了另一个异常。我的问题是:当应用程序处于这种状态时,内存中保存了哪些变量?我该怎么办,也许当跟踪器为空时调用完成?或 Intent 主要 Activity ?

最佳答案

Android 系统并不能确保任何东西永远留在内存中,每当系统需要内存时,它就会开始根据优先级清除后台应用程序和服务。

  • 一种方法是让单例的 getter 处理,如果单例中的 instance 变量为 null 或未初始化,那么您应该初始化它,这可以解决您的问题问题,它会为您的方法添加惰性初始化风格。

  • 另一个是你可以在 onSaveInstance() 中添加一个标志,你可以在你的 onCreate() 中检查它,然后你就会知道这是否是您的 Activity 第一次启动或它已从内存中清除并正在重新初始化。

关于java - 应用程序返回内存时单例不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25032657/

相关文章:

android - 复选框安卓不工作

java - 安卓工作室错误 : E/AndroidRuntime

java - Quartz Scheduler Crontrigger 格式

java - 尝试声明 BottomNavigationView

android - 如何检测智能 watch 何时与智能扩展 API 断开连接/注销

Objective-C:静态字段和实现单例模式

java - 线程安全、静态方法和一些奇怪的代码

java - 我可以 Autowiring 适配器类吗?

java - 寻找 java.net.SocketException : No buffer space available

ios - Singleton 类未正确更新