SharedPrefManager类未初始化实例报错问题求助
嘿,我一眼就瞅出问题所在啦!你声明了lateinit var mCtx: Context,但从来没给它赋值啊!这就是为啥调用isLoggedIn()或者username()时会触发未初始化实例的错误~
问题根源
你的私有构造函数接收了context参数,但完全没把它赋值给mCtx变量。当后续方法尝试用mCtx获取SharedPreferences时,这个变量还处于未初始化状态,自然就报错了。
修复方案(附完整代码)
我帮你把代码修复好了,还补充了单例模式的完整实现(毕竟SharedPrefManager通常做成单例更合理),同时优化了内存泄漏的问题:
class SharedPrefManager private constructor(context: Context) { // 直接用applicationContext初始化,避免内存泄漏,同时去掉lateinit private val mCtx: Context = context.applicationContext fun isLoggedIn(): Boolean { val sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE) // 简化判断逻辑 return sharedPreferences.getString(KEY_USERNAME, null) != null } fun username(): String { val sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE) // 处理空值,避免编译报错(因为getString返回String?,而方法声明返回String) return sharedPreferences.getString(KEY_USERNAME, "") ?: "" } // 补全单例实现+常量定义 companion object { private const val SHARED_PREF_NAME = "MySharedPref" private const val KEY_USERNAME = "username" @Volatile private var instance: SharedPrefManager? = null fun getInstance(context: Context): SharedPrefManager { return instance ?: synchronized(this) { instance ?: SharedPrefManager(context).also { instance = it } } } } }
关键修复点说明
- 初始化mCtx:把之前的
lateinit var mCtx改成直接在构造函数里用context.applicationContext初始化,彻底解决未初始化问题,同时用val保证变量不可变,更安全。 - 避免内存泄漏:使用
applicationContext而不是传入的原始context,因为applicationContext是全局生命周期的,不会随Activity/Fragment销毁而被回收,防止内存泄漏。 - 处理空值:
username()方法里,getString返回的是可空类型String?,而你的方法声明返回String,所以必须用?:处理空值,这里给了默认空字符串,你也可以根据业务需求改成抛出异常或者其他逻辑。 - 完善单例:因为你的类用了私有构造函数,显然是想做成单例模式,所以补全了双重校验锁的单例实现,保证全局只有一个SharedPrefManager实例。
使用方式
之后你需要通过单例方法获取实例,而不是直接创建:
val sharedPref = SharedPrefManager.getInstance(applicationContext) // 调用方法 val isLoggedIn = sharedPref.isLoggedIn() val username = sharedPref.username()
内容的提问来源于stack exchange,提问作者Shikhar Singh
相关产品推荐
相关产品推荐

