我的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"
,但得到了编译错误:(决定粘贴截图,因为整个日志都很大)
UPD 2
最后我决定删除audioFocusRequest
字段并使用旧的弃用方法 - requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)
而不是推荐requestAudioFocus(@NonNull AudioFocusRequest focusRequest)
它帮助我重新编写代码,因此它可以成为解决方案。但我没有找到答案 - 为什么会出现这个问题。这很奇怪,因为以前代码工作过。
所以问题已经解决,但问题仍然没有答案
尝试使用kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"
实现LifecycleObserver
的类有一些方法,它具有只存在于更高API的类型的参数。
您的变量(我猜)和函数参数必须存在于所有API上,甚至不调用函数(可能这是实现LifecycleObserver
的类的要求)。
一种可能的解决方案是将函数参数类型更改为Any
(kotlin)或Object
(Java)并将其转换为适当类型的函数内部。