2016-04-02 51 views
1

我一直在爲我所有的活動做這件事,當我從UI中引用一個元素時,我創建了一個類變量。這有時會導致10 - 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) { 

     } 
    }); 
    } 
} 

是的第二種方法更高效的內存?不再有強類型變量的類變量,因此垃圾回收可以更容易發生。但我只是想知道使用第二種方法的風險是什麼。如果在使用應用程序時發生垃圾回收,那麼addComment linearLayout會失去其點擊功能?

我只是想方法來優化我的應用程序的內存使用。

回答

1

是第二種方法更高效的內存?

並不特別。 LinearLayout addComment參考費用約8字節。

不再有一類變量很強的參考,因此垃圾收集不能在這種情況下更容易

發生,因爲其他東西都握住LinearLayout。畢竟,findViewById()從某處獲得LinearLayout

+0

謝謝 - 我有這種感覺,第二種方法更有記憶效率,實際上即將改變我所有的引用,看起來像第二種方法。 – Simon

+0

@Simon:好的,如果你打算以後再使用這個域,那麼只需要在域中保留一個小部件。如果這是使用該字段的唯一地點,則切換到第二種方法或使用局部變量。什麼決定*更糟糕的是繼續調用'findViewById()'一遍又一遍,檢索相同的部件。這具有CPU和堆碎片成本。 – CommonsWare