gpt4 book ai didi

android - 使用 Datastore 防止内存泄漏的最佳做法是什么?

转载 作者:行者123 更新时间:2023-12-03 14:20:58 24 4
gpt4 key购买 nike

我尝试使用数据存储首选项 alpha07 存储和获取数据,一切正常,我在数据存储中遇到了一些内存泄漏问题
使用 Datastore 防止内存泄漏的最佳做法是什么?
这是我的示例代码:

// Preferences DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha07"
// Leakcanary find memory leak
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.6'
用户管理器.kt
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

class UserManager(val dataStore: DataStore<Preferences>) {

//Create some keys
companion object {
val USER_AGE_KEY = intPreferencesKey("USER_AGE")
val USER_FIRST_NAME_KEY = stringPreferencesKey("USER_FIRST_NAME")
val USER_LAST_NAME_KEY = stringPreferencesKey("USER_LAST_NAME")
val USER_GENDER_KEY = booleanPreferencesKey("USER_GENDER")
}

//Store user data
suspend fun storeUser(age: Int, fname: String, lname: String, isMale: Boolean) {
dataStore.edit {
it[USER_AGE_KEY] = age
it[USER_FIRST_NAME_KEY] = fname
it[USER_LAST_NAME_KEY] = lname
it[USER_GENDER_KEY] = isMale

}
}

//Create an age flow
val userAgeFlow: Flow<Int?> = dataStore.data.map {
it[USER_AGE_KEY]
}

//Create a fname flow
val userFirstNameFlow: Flow<String?> = dataStore.data.map {
it[USER_FIRST_NAME_KEY]
}

//Create a lname flow
val userLastNameFlow: Flow<String?> = dataStore.data.map {
it[USER_LAST_NAME_KEY]
}

//Create a gender flow
val userGenderFlow: Flow<Boolean?> = dataStore.data.map {
it[USER_GENDER_KEY]
}

}
用户.kt
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore

// At the top level of your kotlin file:
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_prefs")
SignInFragment.kt
 //Get reference to our userManager class
var userManager = UserManager(requireContext().dataStore)

//Stores the values
lifecycleScope.launch {
userManager.storeUser(1, "android", "studio", true)
}
HomeFragment.kt
var userManager = UserManager(requireContext().dataStore)
userManager.userAgeFlow.asLiveData().observe(requireActivity(), {
if (it != null) {
age = it
//tv_age.text = it.toString()
}
})
内存泄漏问题:
enter image description here
enter image description here
以下解决方案不起作用
我试过了,即使尝试了这个解决方案,我仍然会泄漏,
在这种情况下,观察者应该与组件的生命周期绑定(bind) Fragment 的生命周期。改用 viewLifeCycleOwner 来绑定(bind)观察者。
HomeFragment.kt
 var userManager = UserManager(viewLifecycleOwner.dataStore)
userManager.userAgeFlow.asLiveData().observe(viewLifeCycleOwner, {
if (it != null) {
// age = it
// tv_age.text = it.toString()
}
})
引用截图(再次复制)
enter image description here

最佳答案

建议的修复
使用您的 Activity'sFragment's context 确实很可疑,实际上没有必要这样做。相反,如果您传递应用程序的全局上下文 ( applicationContext ),则 DataStore不会泄露任何 UI 上下文,并且会处理您的 Preferences请求独立于它们开始的 UI 组件的生命周期。
在您的 Fragments ,写下:

...
var userManager = UserManager(requireContext().applicationContext.dataStore)
...
在您的 MainActivity ,它会更简单:
...
var userManager = UserManager(applicationContext.dataStore)
...
结果
这就是检测到的泄漏数量:
enter image description here

关于android - 使用 Datastore 防止内存泄漏的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66514151/

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