web-dev-qa-db-fra.com

Besoin de contexte dans les classes hors activité

J'ai des classes dans mon application qui doivent appeler Android fonctions qui nécessitent le contexte comme paramètre. Je ne l'ai pas car la classe n'est pas une sous-classe de la classe Activity.

Quelle est la bonne façon de résoudre ce problème?

  1. Passez-le comme paramètre à chaque appel?
  2. Passer à l'instanciation de la classe et le garder?
45
theblitz

Cela dépend du rôle de la classe. Mais passez quand même ApplicationContext mais pas l'Activité un. Si vous passez le contexte d'activité, gc ne peut pas le supprimer de la mémoire lorsque vous n'avez plus besoin d'activité. Mais le contexte d'application est utilisé alors que l'application n'était pas terminée par OS.Refer Evitez les fuites de mémoire

32
Maxim

Passez-le comme paramètre. Ou mieux encore, obtenez le contexte de l'application pour éviter les fuites de mémoire.

public class Example {
    protected Context context;

    public Example(Context context){
        this.context = context.getApplicationContext();
    }
}
17
Mark Mooibroek

Je suis à peu près toujours avec une approche de paramètre constructeur. Je le passe dans l'instanciation et garde une référence privée dans la classe instanciée.

Vous devez penser à une chose importante. Si la classe à laquelle vous passez Context existera plus longtemps que Activity en l'instanciant, vous devez utiliser le contexte d'application. Si cette classe fait des choses d'interface utilisateur, vous aurez besoin d'un contexte d'activité.

Assurez-vous que la classe dans laquelle vous passez un contexte d'activité ne durera pas plus longtemps que Activity ou vous fuierez toute l'activité.

Si vous ne faites pas de choses sur l'interface utilisateur, choisissez le contexte de l'application.

10
Octavian Damiean

Je le passe en paramètre, je pense que c'est la meilleure forme pour le faire

3
Aracem

Passez-le à l'instanciation de la classe et conservez-le.

Un exemple typique est lorsque vous créez un assistant db. Voir ceci lien

3
ccheneson

J'ai répondu à cette question ici également.

Vous pouvez le faire en utilisant ContextWrapper, comme décrit ici.

Par exemple:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

}

et utiliser cette classe pour ainsi dire Contexte

2
ET-CS

La meilleure façon est de suivre l'approche Bean:

public class Example {
    protected Context getContext() {
        ...
    }

    ...
}

Ensuite, cela dépend des possibilités d'accès au contexte. Si la classe est totalement indépendante, le paramètre constructeur et le champ privé semblent la meilleure approche.

Mais cette propriété de bean vous protège de toute modification du code.

1
evilcroco