2016-02-13 71 views
0

在處理Android視圖時,哪種方式更適合內存管理?我相信第二種方法更好,因爲只有在需要時才能訪問TextView,然後希望收集垃圾。很想聽聽你的意見!Android - 視圖中的類變量vs方法變量

public class MainActivity extends Activity { 
    TextView tvHelp; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tvHelp = (TextView) layout.findViewById(R.id.ivHelp); 
     tvHelp.setText("Started"); 
    } 


    @Override 
    public void onResume() { 
     super.onResume(); 

     tvHelp.setText("Resumed"); 
    } 
    } 

或者這

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView tvHelp = (TextView) findViewById(R.id.ivHelp); 
     tvHelp.setText("Started"); 
    } 


    @Override 
    public void onResume() { 
     super.onResume(); 

     TextView tvHelp = (TextView) findViewById(R.id.ivHelp); 
     tvHelp.setText("Resumed"); 
    } 
    } 

回答

1

它不會相差太大。第一個將幫助您避免多次調用findViewById()這是CPU消耗。第二個將幫助你在堆上保留一些字節。但通過這樣做,您還可以創建未堆棧的對象,堆棧堆棧直到GC通過(這是CPU消耗)。 GC也會在內存不足時啓動(例如,當您創建未引用的對象時)。所以第一個解決方案絕對是最好的解決方案。 你會避免:

  • 代碼重複
  • 倍數findViewById調用
  • 直到GC通過
+0

的問題是,我有一個相當大的應用程序,我是這樣做的第一種方式,這成爲堆上非常昂貴,因爲有很多的意見。該應用程序運行緩慢,因爲它使用大量內存來保存這些視圖。我在想第二種方法更好,因爲至少內存使用會更加動態化,並且對象不會停留在周圍,如果它們不被使用 – Nickmccomb

+0

通過使用第二種解決方案確實會獲得一些內存,但我懷疑它是什麼減慢你的應用程序。你在整個應用程序中只使用了1項活動嗎?從一個活動切換到另一個活動時,您持有的視圖/資源將爲GC。你也可以[在IDE的幫助下轉換你的實例變量](http://www.myandroidsolutions.com/2015/01/30/android-studio-tip-2-extract-instance-variable/),看看是否它有什麼區別。 –

1

在你的情況,這將在堆中堆放未引用的對象,也不會就內存消耗而言,真的會有所作爲。活動將通過其層次引用該視圖,直到它被銷燬,無論您是否保留對該視圖的引用。釋放你對它的引用不會被垃圾回收。

一旦活動經過onDestroy(),它和它的視圖層次結構將被垃圾回收,所以對於這種情況我不會擔心差異。

這可以產生差異的一種情況是Fragment s,其中View生命週期與組件生命週期不同。從onCreateView()onViewCreated()引用View可能會暫時導致額外的內存使用,一旦他們在後臺堆棧上。您可以在onDestroyView()中發佈引用,因爲它們無論如何都無效 - 除非您手動保留整個視圖層次結構。

欲瞭解更多信息:https://stackoverflow.com/a/26370042/321697