不要将Android上下文放在静态字段中



我对android开发相当陌生。我知道,如果你不小心处理上下文,可能会导致内存泄漏,但我想做的是在不实例化的情况下使用这个共享偏好

MySharedPref.getInstance(context).amsKey.toString()

这样做对吗?这可以防止内存泄漏吗?我该如何让它变得更好?请参阅下面的MySharedPref:

class MySharedPref(private val ctx: Context) {
enum class key {
AMSKEY,
KEYOFFSET,
DEVICEID,
URL,
PORT,
LOGIN_ENDPOINT
}
var pref: SecurePreferences? = null
init {
pref = SecurePreferences(ctx, INSTANCE, "securedkeypass", true)
}
companion object {
private val INSTANCE = "shared"
private var mInstance: SharedForAmsSecured? = null
@Synchronized
fun getInstance(mCtx: Context): SharedForAmsSecured {
if(mInstance == null) mInstance = SharedForAmsSecured(mCtx)
return mInstance as SharedForAmsSecured
}
}
val amsKey: String?
get() {
return pref?.getString(SharedForAms.key.AMSKEY.name)
}
val keyOffset: Int
get() {
var keyOffset =  pref?.getString(SharedForAms.key.KEYOFFSET.name)
if (keyOffset != null) {
return keyOffset.toInt()
}
return 0
}
val deviceId: String?
get() {
return pref?.getString(SharedForAms.key.DEVICEID.name)
}
val url: String?
get() {
return pref?.getString(SharedForAms.key.URL.name)
}
val loginEndpoint: String?
get() {
return pref?.getString(SharedForAms.key.LOGIN_ENDPOINT.name)
}
val port: String?
get() {
return pref?.getString(SharedForAms.key.PORT.name)
}

SAVING CODES HERE.....
}

这应该是安全的。您正在保存SharedPreference,它不应该有对"活动"的引用。但是,如果您想更加安全,请传入context.getApplicationContext((。这将返回Application对象,该对象可以安全地保存在变量中,作为应用程序级别的单例。事实上,由于这个原因,只要可能,就传递应用程序上下文而不是活动上下文。

最新更新