- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
几天前,我发现单例可以成为 Android 中的反模式。我的单例(具有私有(private)构造函数和存储在静态字段中的实例的类)被删除(实例被删除,尽管事实上其他 Activity 仍在使用这个单例(通过 getInstance() 方法)所以必须创建另一个实例)因为它的 Activity 第一次调用被删除(仅在为这个 Activity 调用完成之后)。
我已经阅读了如何解决这个问题,但是我也刚刚阅读了“Effective Java”。据说“单元素枚举类型是实现单例的最佳方式”。
所以现在我想知道在 Android 应用程序中以这种方式创建的单例的生命周期是什么?它是否与“标准单例实现”的情况相同,所以在销毁第一次调用它的 Activity 后,它将被销毁(即使它也用于其他 Activity )?
我不是在询问正确的 android 单例实现或单例模式本身(它是模式还是反模式等),但我想知道这种枚举单例对象的生命周期是什么以及何时销毁.
最佳答案
在所有情况下,您使用的类都绑定(bind)到加载它们的 ClassLoader
。这在一般的 Java 中都是如此,而不仅仅是 Android。 Android 将通过每次使用新的 ClassLoader
来隔离 Activity ——至少,它不保证不会,据我所知它会这样做。
任何单例或其他类级状态都与 Class
相关联,而 Class
与 ClassLoader
相关联。这就是你的状态“消失”的原因;实际上,您的调用代码在新的 ClassLoader
中看到了新的 Class
。
因此,您的基于枚举的技巧或类似的任何其他技巧将具有完全相同的行为。您只是不能以这种方式“保存” Activity 信息。您可以而且应该写入 SQLite 数据库。您也可以将它存储在 SharedPreferences
中。
关于android - Android 上基于枚举的单例的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8679894/
我是一名优秀的程序员,十分优秀!