web-dev-qa-db-fra.com

Classe Android avec contexte dans le champ objet de Kotlin

Est-il possible d’avoir une propriété dans la classe d’objets de Kotlin contenant un contexte? Sous Android, il est déconseillé de placer des objets liés au contexte dans des champs statiques. Le studio Android le met même en surbrillance et donne un avertissement contrairement à Kotlin où il n'y a aucun avertissement. Exemple d'objet:

object Example {
    lateinit var context: Context

    fun doStuff(){
        //..work with context
    }
}
6
Arnis Shaykh

Puisque objects sont des singletons, ils ont une seule instance statique. Ainsi, si vous leur attribuez une propriété context, vous stockez toujours une Context de manière statique.

Cela aura exactement les mêmes conséquences que de placer une Context dans un champ statique en Java.


Si vous écrivez le code équivalent que Kotlin génère pour une object en Java, cela entraînera les erreurs de lint appropriées:

public class Example {

    // Do not place Android context classes in static fields; this is a memory leak 
    // (and also breaks Instant Run)
    public static Context context;

    // Do not place Android context classes in static fields (static reference to 
    // Example which has field context pointing to Context); this is a memory leak 
    // (and also breaks Instant Run)
    public static Example INSTANCE;

    private Example() { INSTANCE = this; }

    static { new Example(); }

}
8
zsmb13

La raison pour laquelle vous ne recevez aucun avertissement est car le studio Android n'a pas de règles de vérification de la charpie évoluées pour Kotlin utilisé pour Android. Une fois que toolkit team met à jour son lint check rules pour kotlin avec Android, l'avertissement apparaît à nouveau.

1
erluxman