2013-07-17 43 views
5

我想知道一些基本的東西如何有效地使用靜態變量?

我正在開發一個android應用程序,因此它導致我的內存管理問題。 最近觀看了一個與谷歌內存管理相關的視頻我發現,在活動中使用靜態變量會導致內存泄漏,即使在活動方向發生變化時也會導致內存泄漏,因爲它會保持對活動中的其他對象的引用,視頻中的該男子說,使用靜態的在靜態方法的幫助下變量將解決問題,我想知道靜態方法將如何解決問題?

我想知道的最好的方式來使用靜態變量在我的應用程序,比如我有一個全球性的類中,我將一些靜態變量正如其名稱所示,這些值將進行評估,並通過不同的活動, 作爲修改一個例子,我有一個靜態變量WIDTH和當前更新它像這樣

Global.WIDTH = 12

或得到它像int width = Global.WIDTH 從不同activites,就是這是一個正確的方法,還是我必須使用靜態方法得到像int width = Global.getWidth();寬度,那麼什麼是這兩個之間的區別,什麼是做到這一點的最好辦法,

什麼是我們必須要記住與靜態變量打交道時,其他重要的事情?

感謝大家在百忙之中長描述...

+0

當字段/方法必須屬於類而不是任何對象引用時,請使用'static'。如果在'Activity'中使用,我會推薦使用'static final'來聲明這個字段是一個常量,而不是在那裏有一個普通的''static'字段。 –

+0

感謝您的快速回復..我無法將其聲明爲final,因爲它的值將根據計算基於計算而改變 –

+1

您可以聲明它爲'static final'並在'static {}'方法中定義值。請注意,即使這些值是* dynamic *,它們也只能在應用程序啓動時加載一次,而不是在應用程序的任何時候加載。如果要爲景觀可視化設置不同的寬度和高度,請添加兩個字段而不是重新計算值。 –

回答

1

靜態變量可能會導致內存泄漏,因爲他們永遠不會走出去的範圍,但如果你只有幾元,如int或長那麼你不會有問題。

如果您開始引用靜態變量中的對象,尤其是集合,則需要小心。如果一個集合永遠不會超出範圍,那麼它也不會包含在它的任何對象中,也不會包含它們引用的任何對象,因此這些集合有可能會繼續增長並耗盡更多內存。

雖然你的問題的變量,大概是一個int,但是會好的。

+0

謝謝尼克的答案,我用int作爲例子,我想知道靜態字段和靜態方法的用法有什麼區別 –

+1

我想不出任何使用靜態方法的內存含義。 Global.width和Global.getWidth()之間的唯一區別是該方法允許您在調用時計算該值。在方法中聲明和使用的任何變量都不會導致內存泄漏,因爲方法一結束就會超出範圍。 – NickJ