【问题标题】:a Java singleton class does not call its constructor on AndroidJava 单例类不会在 Android 上调用其构造函数
【发布时间】:2014-04-14 18:47:13
【问题描述】:

我正在开发一款在 Android 上运行的带有 libGdx 的游戏。 我有一些与单例模式有关的情况。

在我的应用程序中,所有绘图调用都由一个名为“Spritepool”的类管理。 它在主线程上运行,进行纹理更新、排序、绘图……所以我把它做成了单例。

它几乎可以正常工作..但是退出一次后重新启动时应用程序崩溃。

我认为这是因为当应用再次启动时单例类 Spritepool 没有调用其构造函数...

将 Spritepool 更改为枚举单例并不是一个解决方案。 我的 Spritepool 类看起来像这样..

public enum Spritepool {
    INSTANCE;

    BitmapFont debug = new BitmapFont();

    public static Spritepool get(){ return INSTANCE; }  
    Spritepool(){
        Gdx.app.log("sprite pool", "=== sprite pool constructor calling... ");
    }

    ...
    ...

    public void workingCodes(){...}
}

我现在已经从构造函数 Spritepool() 中删除了除日志之外的所有初始化。 首次启动应用程序时,构造函数的日志打印良好,并且成员“调试”实例化良好。 退出应用程序并重新启动后,所有应用程序循环正常工作,Spritepool() 日志消失,成员“调试”指向垃圾..(不是 new BitmapFont()..)

这是 android 上常见单例类的正常行为吗? (我认为不是......也许我在某处做错了) ..我应该怎么做才能使它正确? 任何建议将被认真考虑。谢谢。

【问题讨论】:

  • ...您是否遇到任何错误/异常?
  • 退出时没有异常,我认为它仍然在内存中的某个地方
  • 单例对于一个进程来说是静态的,所以除非你最终得到一个新进程,否则它可能不会被更新。通常,重新启动 Android 活动将转到现有进程。但是,如果单个字段与不再存在的 Activity 或 View 或类似内容相关联,则可能包含不再可用的内容。
  • @ChrisStratton 我开始感觉到了……也许我应该检查退出呼叫……谢谢!!
  • 等等......我正在使用很多枚举,也许所有这些枚举都有像这个这样的潜在问题,直到我修复这个......哇哦......

标签: java android constructor enums singleton


【解决方案1】:

为什么要使用枚举?

试试这个:

公共类 Spritepool { 私有 Spritepool 实例;

BitmapFont debug = new BitmapFont();

public static Spritepool get(){ 
     if (INSTANCE == null) INSTANCE = new Spritepool();
     return INSTANCE; 
}  
Spritepool(){
    Gdx.app.log("sprite pool", "=== sprite pool constructor calling... ");
}

...
...

public void workingCodes(){...}

}

【讨论】:

  • 我的想法是 java enum 会自我实例化,所以它可以解决我的问题。 (我认为在这种情况下是合适的方法)..无论如何,我刚才尝试了你的建议,但它再次失败了......谢谢。
  • 枚举是静态单例的更好用例。
猜你喜欢
  • 2018-02-28
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多