【问题标题】:Android LiveData: MutableData is never on active stateAndroid LiveData:MutableData 永远不会处于活动状态
【发布时间】:2017-06-20 22:31:30
【问题描述】:

我有以下ViewModel

class SignInViewModel @Inject constructor(val api: BillingApi) : ViewModel() {
    val googleApiClient: MutableLiveData<GoogleApiClient> = MutableLiveData()
}

在我的Activity.onCreate(onSavedInstanceState: Bundle?) 我有:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    signInViewModel = ViewModelProviders.of(this)
            .get(SignInViewModel::class.java)

    signInViewModel.googleApiClient.observe(this, Observer<GoogleApiClient?> {
        ... // here never gets trigged
    }

稍后在我的代码中我有signInViewModel.googleApiClient.value = it。此时(在单击按钮后发生,因此我处于恢复状态)我希望 LiveData 触发我的观察者,但它不会

在调试时,我注意到我的 MutableLiveData 从未处于 active 状态。

我做错了什么?拜托,我知道我在示例中使用了 GoogleApiClient 实例,并且应该使用带有 automanage 之类的 Activity 对其进行初始化,但这不是这里的问题。我想动态设置它并触发我的观察者。

编辑:添加调用setValue的代码

signInViewModel.someMethod(this)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(Consumer {
                // This gets called but the observe callback does **not**
                signInViewModel.googleApiClient.value = it
            }, errorCallback)

【问题讨论】:

  • 你能添加代码 sn-p 有signInViewModel.googleApiClient.value = it 行吗?
  • 当然……这是一个 RxJava 订阅。它没有什么特别之处,但它就在这里(也强调我已经调试过它并调用了回调。在 LiveData 中,观察者不被认为是活动的,因此不会被调用。
  • 看到您在SignInViewModel 类中的代码流存在问题。您需要发布整个SignInViewModel 课程。如果您不能放置所有代码,请在方法中删除您的业务登录,但保持方法流。根据您提供的信息,没有人可以提供解决方案。
  • 我已经用你在帖子中看到的整个班级重现了这个错误。抱歉,SignInViewModel 已完成。
  • @Olinasc 只是想知道如何在不使用任何 ViewModel 工厂的情况下注入 billingApi

标签: android kotlin android-architecture-lifecycle


【解决方案1】:

事实证明minifyEnabled 是真的。我还没有看到有关架构组件的 proguard 规则的任何信息。

找到了这个issue,它还没有解决,但是有配置让它通过:

-keepclassmembers class * implements android.arch.lifecycle.LifecycleObserver {
    <init>(...);
}
-keepclassmembers class * extends android.arch.lifecycle.ViewModel {
    <init>(...);
}
-keepclassmembers class android.arch.lifecycle.Lifecycle$State { *; }
-keepclassmembers class android.arch.lifecycle.Lifecycle$Event { *; }
-keepclassmembers class * {
    @android.arch.lifecycle.OnLifecycleEvent *;
}

-keep class * implements android.arch.lifecycle.LifecycleObserver {
    <init>(...);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2022-01-23
    • 2019-10-12
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多