LifecycleObserver使用较新的API方法时会产生异常

6

我的ViewModel类实现了LifecycleObserver。当我调用fragment.lifecycle.addObserver(this)时,会产生异常。

导致原因:java.lang.IllegalArgumentException:观察器类具有使用当前操作系统版本中不可用的较新API的某些方法。 生命周期甚至无法访问其他方法,因此您应确保您的观察器类仅访问在min API级别中可用的框架类,或使用lifecycle:compiler注释处理器。

奇怪的是,它一开始是正常工作的,但不久前出现了这个异常。我发现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")
}

有人知道如何修复吗?

更新

尝试使用annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version",但出现编译错误: enter image description here (决定粘贴屏幕截图,因为整个日志非常大)

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

这帮助我使代码再次工作,所以这可能是解决方案。但我没有找到答案-为什么会出现这个问题。这很奇怪,因为代码之前可以工作。

因此问题已经解决,但问题仍然未得到解答。


GradleException: 编译错误。请查看日志获取更多详细信息。你在日志中发现了任何有趣的东西吗? - shkschneider
无任何东西。 - Andrii Turkovskyi
4个回答

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

为什么应该尝试这个,以及如何尝试?请在您的回答中添加一些解释,以便其他人可以从中学习。 - Nico Haase
我尝试使用kapt代替annotationProcessor,但项目根本无法构建,在同步期间出现了错误。 - Andrii Turkovskyi
这对我真的很有帮助。 - Asura
我尝试了annotationProcessorkapt,同时使用这两种方式,因为项目是Java和Kotlin混合编写的,但这并没有解决问题。 - Chisko

0

我必须在SpinnerView上删除这个set方法:lifecycleOwner = viewLifecycleOwner


0

实现 LifecycleObserver 接口的类有一些方法,这些方法具有仅存在于更高 API 中的类型参数

您的变量(我猜)和函数参数必须在所有 API 上存在,即使函数没有被调用(也许这是实现 LifecycleObserver 接口的类的要求)。

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


正如我所写的那样 - 这是由于 AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) 引起的,并且建议使用更高的API。最终,我决定删除 audioFocusRequest 字段并使用旧的弃用方法来处理音频焦点变化。但我仍然不知道到底是什么导致了这个错误,以及如何处理它。 - Andrii Turkovskyi

0

我通过将有问题的方法移动到另一个类中并仍然从我的LifecycleObserver调用来解决了这个问题。再次阅读错误消息后:

Caused by: java.lang.IllegalArgumentException: 观察者类具有使用当前操作系统版本中不可用的较新API的某些方法。生命周期甚至无法访问其他方法,因此您应确保观察者类仅访问可在min API级别中使用的框架类或使用lifecycle:compiler注释处理器。

似乎如果类扩展LifecycleObserver的方法或对象在设备的操作系统中不存在,则不允许它们存在,即使它们被包装在SDK版本检查中并且从未被访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接