LifecycleObserver使用使用较新API的方法生成异常

问题描述 投票:2回答:1

我的ViewModel类实现了LifecycleObserver。当我打电话给fragment.lifecycle.addObserver(this)时,它会产生异常。

引发者:java.lang.IllegalArgumentException:observer类有一些方法使用当前操作系统版本中不可用的较新API。生命周期甚至无法访问其他方法,因此您应该确保您的观察者类只访问最低API级别中可用的框架类或使用生命周期:编译器注释处理器。

奇怪的是,首先它工作正常,但不久前这个例外已经出现。我发现,audioFocusRequest是导致这个错误的原因。

private val audioFocusRequest by lazy {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
        .setOnAudioFocusChangeListener(this)
        .build() else throw RuntimeException("Can't be done for Android API lower than 26")
}

有人知道它是如何修复的吗?

UPD

试图使用annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version",但得到了编译错误:enter image description here(决定粘贴截图,因为整个日志都很大)

UPD 2 最后我决定删除audioFocusRequest字段并使用旧的弃用方法 - requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)而不是推荐requestAudioFocus(@NonNull AudioFocusRequest focusRequest)

它帮助我重新编写代码,因此它可以成为解决方案。但我没有找到答案 - 为什么会出现这个问题。这很奇怪,因为以前代码工作过。

所以问题已经解决,但问题仍然没有答案

android kotlin android-lifecycle fragment-lifecycle
1个回答
0
投票

尝试使用kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"


0
投票

实现LifecycleObserver的类有一些方法,它具有只存在于更高API的类型的参数。

您的变量(我猜)和函数参数必须存在于所有API上,甚至不调用函数(可能这是实现LifecycleObserver的类的要求)。

一种可能的解决方案是将函数参数类型更改为Any(kotlin)或Object(Java)并将其转换为适当类型的函数内部。

© www.soinside.com 2019 - 2024. All rights reserved.