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

时间:2019-02-06 14:20:35

标签: android kotlin android-lifecycle fragment-lifecycle

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

  

原因:java.lang.IllegalArgumentException:该观察器类具有一些使用较新API的方法,这些API在当前OS版本中不可用。生命周期甚至无法访问其他方法,因此您应确保观察者类仅访问最小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")
}

有人知道如何解决吗?

UPD

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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

实现LifecycleObserver的类具有某种方法,该方法具有类型为参数的参数,仅适用于高级API。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我可以通过将有问题的方法移到另一个类中来解决此问题,但是仍然可以从LifecycleObserver中调用它。再次阅读错误消息后:

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

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