2016-04-02 1 views
1

Je l'ai fait pour toutes mes activités lorsque je référence un élément de mon interface utilisateur, je crée une variable de classe. Cela peut parfois conduire à 10 - 20 variables de classe juste pour les éléments de l'interface utilisateur:Android: références à findViewById

public class CommentActivity extends AppCompatActivity { 

     LinearLayout addComment; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_comment); 
      addComment = (LinearLayout) findViewById(R.id.addcomment); 
      addComment.setOnClickListener(// add an onclick listener here //); 
     } 
    } 

Maintenant, je l'ai observé en regardant le code des autres que, parfois, ils le feraient à la place:

public class CommentActivity extends AppCompatActivity { 

    // LinearLayout addComment; no more reference to class variable 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_comment); 
     //they just findViewById and add on the onclick listener 
     findViewById(R.id.addcomment).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 
    } 
} 

Est-ce le deuxième méthode plus de mémoire efficace? Il n'y a plus de référence forte de variable de classe et donc la collecte de place peut se faire plus facilement. Mais je me demande simplement quel est le risque d'utiliser la seconde méthode. Si la récupération de place se produit lors de l'utilisation de l'application, le addComment linearLayout perd-il sa fonctionnalité de clic? J'essaie juste d'optimiser l'utilisation de la mémoire de mon application.

Répondre

1

La deuxième méthode est-elle plus efficace en termes de mémoire?

Pas particulièrement. La référence LinearLayout addComment coûte ~ 8 octets.

Il n'y a plus une référence forte variable de classe et donc la collecte des ordures peut se produire plus facilement

Pas dans ce cas, puisque d'autres choses tiennent sur le LinearLayout. Après tout, findViewById() obtient le LinearLayout de quelque part.

+0

Merci - J'ai eu cette perception que la seconde méthode était plus efficace en mémoire et était sur le point de changer toutes mes références pour ressembler à la seconde méthode à la place. – Simon

+0

@Simon: Eh bien, ne vous occupez que d'un widget dans un champ si vous prévoyez d'utiliser le champ plus tard. Si c'est le seul et unique endroit où le champ est utilisé, passez à la seconde approche ou utilisez une variable locale. Ce qui est décidément * pire * est de continuer à appeler 'findViewById()' encore et encore, en récupérant le même widget. Cela a des coûts de fragmentation CPU et tas. – CommonsWare