我正在将iOS项目移植到Android。 iOS项目利用几个关键单例为应用程序提供全局资源,例如数据库和一组Web服务。其中许多单身人士使用文件,网络或共享偏好等资源。
我在尝试将此移植到Android时遇到了很多问题,因为在编写不属于Activity的单例代码时,我经常需要“Context”对象。当我第一次构造单例时,我通常可以传入一个Context,但我听说我不应该将它存储为成员变量,因为它可能会导致内存泄漏。
处理这个问题的最佳方法是什么?
答案 0 :(得分:1)
当我第一次构造单例时,我通常可以传入一个Context,但我听说我不应该将它存储为成员变量,因为它可能导致内存泄漏。
使用来自Application
(getApplication()
)或Activity
(在任何其他getApplicationContext()
上)的Context
对象。这本身就是一个单身人士,所以它是预先泄露的,不能再被泄露。
请注意,尽管Application
对象不适用于与UI紧密相关的任何内容Context
(例如,夸大布局);这样的事情一般不应该是单身人士。
有关详细信息,请参阅Dave Smith's epic blog post on the roles of different types of Context
。
答案 1 :(得分:1)
如果您必须在应用中保留单身人士,则可以将<add key="sqlConnectString" value="Data Source=db01\pd; Initial Catalog=PDB; Trusted_Connection=Yes;"/>
<add key="sqlConnectString" value="Data Source=db01\pd; Initial Catalog=PDB; Integrated Security=SSPI;"/>
传递给使用context
的单身人士方法
在MySingleton.java中
context
从活动/服务调用
public class MySingleton {
//private instance, private constructor and getInstance() goes here
public void doSomething(Context context, int foo, int bar) {
//Use context
}
}
从碎片调用
MySingleton.getInstance().doSomething(this, 1, 2);
如果你能负担不断变化的建筑,请避开单身人士。您可以使用依赖注入作为替代方案。 This就是这样做的。