J'ai étudié les meilleures pratiques pour éviter les fuites de mémoire de contexte/activité lors de la création de vues, et je n'arrive pas à trouver une réponse définitive à ce qui est autorisé ou non. arrive aux champs statiques dans les classes.Android: champs statiques et fuites de mémoire
Disons que j'ai un code de cette forme:
public class MyOuterClass extends Activity{
private MyInnerClass;
MyInnerClass = (MyInnerClass) findViewById(<XML call here>);
MyInnerClass.myXInt = 3;
// onCreate(), onResume(), etc.
public static class MyInnerClass extends SurfaceView implements Runnable{
// Safe variables?
private static int myXInt, myYInt;
private static boolean myBoolean;
// Potentially safe?
private static Canvas myCanvas;
// Definitely bad.
private static Context myContext;
public MyInnerClass(Context context){
myContext = context; // This is bad.
}
}
}
Je suis un peu confus sur ce que la machine virtuelle Java considère en fait le ClassLoader pour MyInnerClass. Techniquement, puisqu'il s'agit d'un objet SurfaceView, il semble que les variables statiques devraient toujours exister une fois que l'application a instancié MyInnerClass une fois (ce qui arrive lorsque la vue est gonflée), et y rester jusqu'à ce que l'application soit terminée. Si tel est le cas, qu'est-ce qui empêche les objets Bitmaps et Canvas de rester ouverts et de remplir le tas? La seule déclaration que je vois encore et encore est que vous ne pouvez pas fuir le contexte statique comme je l'ai montré dans le constructeur, mais cela ne va jamais au-delà. Est-ce vraiment la seule chose que vous ne pouvez pas faire?
votre 'Canvas' etc. n'a pas besoin d'être' static'. De cette façon il resterait en effet dans le tas pour toujours – zapl
Si tel est le cas alors qu'est-ce qui empêche les constantes (c'est-à-dire - private static final int MY_CONSTANT), de tenir aussi n'importe quelle classe qui étend l'activité (et son contexte) ouverte? – SeaNick