2016-04-02 20 views
1

私はUIから要素を参照するときに、すべてのアクティビティに対してこれを行っています。クラス変数を作成します。これは、時には10個のにつながることができます - ちょうどUI要素のための20クラス変数:Android: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 //); 
     } 
    } 

を、私は時々、彼らが代わりにこれを行うだろう他の人のコードを見て、観察している:

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

     } 
    }); 
    } 
} 

です2番目の方法はより効率的なメモリですか?クラス変数の厳密な参照がなくなり、ガベージコレクションがより簡単に実行できます。しかし、私は、第2の方法を使用することのリスクが何であるか不思議です。アプリ使用時にガベージコレクションが発生した場合は、addComment linearLayoutのクリック機能が失われますか?

私はアプリのメモリ使用を最適化する方法を試しています。

答えて

1

2番目の方法はより効率的ですか?

特にありません。 LinearLayout addCommentの参照コストは8バイトです。

は、もはやクラス変数の強い参照がありませんし、他のものはLinearLayout上に保持されているので、したがって、ガベージコレクションは、ないこのケースでは、より簡単

発生する可能性があります。結局、findViewById()はどこかからLinearLayoutになっています。

+0

ありがとうございました - 私は、第2の方法がメモリ効率が良く、実際には第2の方法のように見えるようにすべての参照を実際に変更しようとしているという認識を持っていました。 – Simon

+0

@Simon:あとでフィールドを使用する予定の場合は、フィールド内のウィジェットを持っているだけです。フィールドが使用されている1つだけのスポットであれば、2番目のアプローチに切り替えるか、ローカル変数を使用します。明らかに*悪い*は、findViewById()を何度も呼び出して、同じウィジェットを取得し続けることです。これにはCPUとヒープの断片化コストがあります。 – CommonsWare