6
votes

LifecycleObserver génère une exception avec des méthodes qui utilisent des API plus récentes

Ma classe ViewModel implémente LifecycleObserver . Lorsque j'appelle fragment.lifecycle.addObserver (this) , cela produit une exception.

Causé par: java.lang.IllegalArgumentException: la classe observer a des méthodes qui utilisent des API plus récentes qui ne sont pas disponibles dans la version actuelle du système d'exploitation. Les cycles de vie ne peuvent même pas accéder à d'autres méthodes, vous devez donc vous assurer que vos classes d'observateur n'accèdent qu'aux classes de framework qui sont disponibles dans votre niveau d'API minimum OU utilisent lifecycle: compiler annotation processor.

Étrange, d'abord cela fonctionnait bien, mais il n'y a pas longtemps, cette exception est apparue. J'ai trouvé que audioFocusRequest est la cause de ce bogue.

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")
}

Est-ce que quelqu'un sait comment le corriger?

UPD

J'ai essayé d'utiliser annotationProcessor "androidx.lifecycle: lifecycle-compiler: $ lifecycle_version" , mais j'ai obtenu une erreur de compilation: entrez la description de l'image ici (a décidé de coller une capture d'écran, car les journaux entiers sont assez volumineux)

UPD 2
À la fin, j'ai décidé de supprimer le champ audioFocusRequest et d'utiliser l'ancienne méthode obsolète - requestAudioFocus (OnAudioFocusChangeListener l, int streamType, int durationHint) au lieu de requestAudioFocus recommandé (@NonNull AudioFocusRequest focusRequest)

Cela m'a aidé à faire fonctionner le code à nouveau, donc cela peut être une solution. Mais je n'ai pas trouvé de réponse - pourquoi ce problème était apparu. C'est étrange car le code fonctionnait auparavant.

Le problème a donc été résolu mais la question reste toujours sans réponse


2 commentaires

"GradleException: Erreur de compilation. Voir le journal pour plus de détails" Avez-vous trouvé quelque chose d'intéressant dans le journal?


Rien du tout.


4 Réponses :


6
votes

Essayez d'utiliser kapt "androidx.lifecycle: lifecycle-compiler: 2.0.0"


3 commentaires

Pourquoi devrait-on essayer cela et comment? Veuillez ajouter quelques explications à votre réponse afin que d'autres puissent en tirer des leçons


J'ai essayé d'utiliser kapt au lieu de annotationProcessor et le projet ne s'est pas du tout construit, il y a eu une erreur lors de la synchronisation


ça m'aide vraiment



0
votes

La classe qui implémente LifecycleObserver a une méthode, qui a des paramètres de type qui n'existent que pour les API supérieures.

Vos variables (je suppose) et paramètres de fonction doivent exister sur toutes les API même si la fonction n'est pas appelée (peut-être que c'est une exigence pour les classes qui implémentent LifecycleObserver < / code>).

Une solution possible est de changer le type de paramètre de fonction en Any (kotlin) ou Object (Java) et de le convertir en type approprié dans la fonction.


1 commentaires

Comme je l'ai écrit - cela a été causé par AudioFocusRequest.Builder (AudioManager.AUDIOFOCUS_GAIN) et il recommande une API plus élevée. Enfin, j'ai décidé de supprimer le champ audioFocusRequest et d'utiliser d'anciennes méthodes obsolètes pour gérer les changements de mise au point audio. Mais je ne sais toujours pas ce qui a exactement casé cette erreur et comment elle peut être gérée



0
votes

Je dois supprimer cette méthode définie sur SpinnerView: lifecycleOwner = viewLifecycleOwner


0 commentaires

0
votes

J'ai pu résoudre ce problème en déplaçant les méthodes incriminées dans une autre classe, mais toujours appelée depuis mon LifecycleObserver. Après avoir relu le message d'erreur:

Causé par: java.lang.IllegalArgumentException: la classe observer a des méthodes qui utilisent des API plus récentes qui ne sont pas disponibles dans la version actuelle du système d'exploitation. Les cycles de vie ne peuvent même pas accéder à d'autres méthodes, vous devez donc vous assurer que vos classes d'observateur n'accèdent qu'aux classes de framework qui sont disponibles dans votre niveau d'API minimum OU utilisent lifecycle: compiler annotation processor.

Il semble qu'aucune méthode ou aucun objet ne soit autorisé dans la classe étendant LifecycleObserver s'ils n'existent pas dans le système d'exploitation de l'appareil, même s'ils sont encapsulés dans une vérification de version du SDK et jamais consultés.


0 commentaires