gpt4 book ai didi

android - 可以将 sharedPrefrence 与 Coroutine kotlin 一起使用吗

转载 作者:行者123 更新时间:2023-11-29 02:18:19 30 4
gpt4 key购买 nike

我在 ViewModel 中注入(inject)了 sharedPreference

Can I use android specific resource's while embedding Coroutine scope which automatically suspended when ViewModel loses scope.

我的意思是,如果我们添加一个 viewModel 启动范围,可以在 ViewModel 中使用 preferende 吗

CoroutineScope 会跟踪它创建的所有协程。因此,如果您取消一个作用域,您将取消它创建的所有协程

@ContributesViewModel
class SplashViewModel @Inject constructor(private val prefs: PrefStore) : BaseViewModel() {

val onMoveToNext = ClassLiveData()

init {
scope.launch {
val activity = if(prefs.isLoggedIn()) HomeActivity::class
else OnBoardingActivity::class
onMoveToNext.postValue(activity)
}
}

///fun saveDeviceID(id:String) = prefs.setDeviceID(id)
//fun createErrorCodeHash() ={}

fun getIsLoggedIn():Boolean = prefs.isLoggedIn()

fun setSecondTimeLogin(boolean: Boolean) = prefs.setIsSecondTimeLogin(boolean)
}

在哪里

abstract class BaseViewModel: ViewModel() {

private val job = Job()
val scope = CoroutineScope(Dispatchers.IO + job)

override fun onCleared() {
super.onCleared()
job.cancel()
}

}

其中 ClassLiveData

typealias ClassLiveData = MutableLiveData<KClass<*>>

并在SplashActivity中调用它

viewModel.onMoveToNext.listen(this) {
Handler().postDelayed({
val intent = Intent(this, it.java)
intent.putExtra("Role", "LOGIN")
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(intent)
}, 2000)

最佳答案

作为一般经验法则,当涉及到保留对 context 或其他对 context 有硬引用的对象(例如 ContextWrapper,这是 SharedPreferences 的来源),应该将协程与经典线程一样对待。

例如,带有Dispathers.IO 的实时协程可能以与经典线程相同的方式泄漏上下文 AsyncTasks 等。因此,管理这些引用并清理它们是开发人员的责任。

回顾你的代码,你的基础 ViewModel 正在 IO 范围内工作,这意味着任何空构造函数 luanches,创建一个同一 Dispatcher 上的子作用域,即 IO。然而,由于您的 ViewModel.onCleared():

override fun onCleared() {
super.onCleared()
job.cancel()
}

相当安全。

为什么我说“差不多”?

因为这取决于您如何实现launches。请记住,仅取消 job 并不一定意味着相应的协程已关闭并且每个引用都已删除。某些实现需要您直接检查范围内的作业状态并进行手动清理:

例如,如果您在协程中创建一个 while 循环,job.cancel() 不会中断它,您需要中断 手动。

最后一次回顾你的代码,你没有在你的 launch 中做任何需要手动清理的事情。那么,我们可以说您当前的代码肯定不会泄漏上下文

关于android - 可以将 sharedPrefrence 与 Coroutine kotlin 一起使用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58536773/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com