2016-04-02 10 views
1

Ich habe dies für alle meine Aktivitäten getan, wenn ich ein Element von meiner Benutzeroberfläche referenziere, ich erstelle eine Klassenvariable. Dies kann manchmal bis 10 führen - 20 Klassenvariablen nur für UI-Elemente:Android: Referenzen zu 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 //); 
     } 
    } 

Jetzt habe ich beobachtet, in anderen Leute Code suchen, manchmal würden sie dies tun, anstatt:

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) { 

     } 
    }); 
    } 
} 

Ist zweite Methode mehr Speicher effizient? Es gibt keine starke Referenz für die Klassenvariable mehr und daher kann die Speicherbereinigung leichter erfolgen. Aber ich frage mich nur, was das Risiko der Verwendung der zweiten Methode ist. Wenn die Garbage Collection bei der Verwendung der App erfolgt, verliert die addComment linearLayout ihre Klickfunktionalität?

Ich versuche nur, den Speicherverbrauch meiner App zu optimieren.

Antwort

1

Ist die zweite Methode effizienter?

Nicht besonders. Die LinearLayout addComment Referenz kostet ~ 8 Bytes.

Es ist nicht mehr eine Klassenvariable starke Referenz und kann daher Garbage Collection leichter

Nicht in diesem Fall geschehen, da andere Dinge auf die LinearLayout halten. Immerhin bekommt findViewById() die LinearLayout von irgendwo.

+0

Dank - ich hatte diese Wahrnehmung, dass die zweite Methode mehr Speicher effizienter war und war eigentlich im Begriff, alle meine Referenzen zu ändern, um stattdessen wie die zweite Methode aussehen. – Simon

+0

@Simon: Nun, halten Sie sich nur an einem Widget in einem Feld fest, wenn Sie das Feld später verwenden möchten. Wenn dies der einzige Ort ist, an dem das Feld verwendet wird, wechseln Sie entweder zum zweiten Ansatz oder verwenden Sie eine lokale Variable. Was entschieden * schlimmer ist, ist, 'findViewById() 'immer wieder aufzurufen und das gleiche Widget abzurufen. Das hat CPU- und Heapfragmentierungskosten. – CommonsWare

Verwandte Themen