LifecycleObserver создает исключение с помощью методов, которые используют более новые API - PullRequest
0 голосов
/ 06 февраля 2019

Мой ViewModel класс реализует LifecycleObserver.Когда я вызываю fragment.lifecycle.addObserver(this), это вызывает исключение.

Причина: java.lang.IllegalArgumentException: у класса наблюдателя есть некоторые методы, которые используют более новые API, которые недоступны в текущей версии ОС.Жизненные циклы не могут получить доступ даже к другим методам, поэтому вам следует убедиться, что ваши классы-наблюдатели обращаются только к классам инфраструктуры, доступным на вашем минимальном уровне API, ИЛИ используют lifecycle: процессор аннотаций компилятора.

Странно, но сначала это былоработает нормально, но не так давно это исключение появилось.Я обнаружил, что 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)

Это помогло мне снова заставить работать код, поэтому оно можетбыть решением.Но я не нашел ответа - почему появилась эта проблема.Это странно, потому что код раньше работал.

Так что проблема была решена, но вопрос все еще остается без ответа

Ответы [ 2 ]

0 голосов
/ 13 августа 2019

Класс, который реализует LifecycleObserver, имеет некоторый метод, который имеет параметры с типом , которые существуют только для более высоких API.

Ваши переменные (я полагаю)и параметры функции должны существовать во всех API, даже если функция не вызывается (может быть, это требование для классов, которые реализуют LifecycleObserver).

Возможное решение - изменить тип параметра функции на Any (kotlin) или Object (Java) и приведите его к соответствующему типу внутри функции.

0 голосов
/ 05 марта 2019

Попробуйте использовать kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"

...