[英]How to return value from DataStore in non-suspend function
我在共享首選項中保存應用程序語言,並通過覆蓋活動中的attachBaseContext()
來設置應用程序語言,如下所示:
override fun attachBaseContext(base: Context) {
val language: String = sharedPreferences.language
super.attachBaseContext(wrapContext(base, language))
}
其中wrapContext()
是 function 根據其參數值更改語言。
遷移到 DataStore 后,我無法返回attachBaseContext()
中的語言,因為它沒有掛起 function,並且語言成為一個流(應該在掛起函數內收集)
我怎么解決這個問題?
DataStore 是異步的 API 用於寫入和讀取少量數據。 要同步讀取數據,您需要使用runBlocking
協程構建器。 這將阻塞調用線程,直到 DataStore 返回可能導致ANR :
val syncData = runBlocking { context.dataStore.data.first() } // or { context.dataStore.data.firstOrNull() }
這是一個很好的機會,可以考慮如何在不使用runBlocking
的情況下異步使用 DataStore,或許可以進行一些重構。
如果您決定使用runBlocking
,您需要考慮合理的超時時間,以免永遠凍結 UI:
val syncData = runBlocking {
withTimeoutOrNull(2000) { // UI can freeze for 2 seconds
context.dataStore.data.first()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.