gpt4 book ai didi

Android:在 attachBaseContext 中使用 DataStore

转载 作者:行者123 更新时间:2023-12-05 06:02:33 50 4
gpt4 key购买 nike

当我在我的应用程序中使用Datastore 制作可以动态切换语言的功能时,我发现了一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

我的代码很简单:

open class BaseActivity : AppCompatActivity() {

override fun attachBaseContext(newBase: Context) {
lifecycleScope.launch(Dispatchers.Main) {
var context = newBase
val language = withContext(Dispatchers.IO) {
DataStore.read(context, DataStore.KEY_LANG)
}
context = Language.changeLanguage(context, language ?: Language.ZH)
super.attachBaseContext(context)
}
}

Language.changeLanguage 将返回更新本地的上下文:

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
fun changeLanguage(context: Context, lang: String): Context {
val configuration = context.resources.configuration
configuration.setLocale(getLocal(lang))

return context.createConfigurationContext(configuration)

我调试我的应用程序,发现代码无法到达 super.attachBaseContext(context) 并完成。我不知道原因,但我猜是因为协程。

最佳答案

问题是 Application 是一个 ContextWrapper 并且在 attachBaseContext 返回后它假定底层上下文已经正确设置。

由于您将 super.attachBaseContext 的调用推迟到协程的末尾,因此在协程有机会运行之前不会调用此方法(因为发生在 Dispatchers.Main 这可能是在正常初始化完成之后,因为这是同步发生的),打破了方法的约定。

实际上你有三种选择:

  1. 接受您必须阻塞才能同步获取更新的上下文。虽然这并不理想,但无需更改其他代码即可工作。
  2. 创建和管理您自己的上下文,用于在下游创建资源。可能是最不方便的,因为很多库都使用 context.getApplicationContext()
  3. 使用其他人创建的库来解决问题,因为它可能不是唯一的。 Google 迅速将我指向 YarikSOffice / lingver

关于Android:在 attachBaseContext 中使用 DataStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66897932/

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