2015-05-05 164 views
7

我是android和java開發中的新手,我想了解一些東西。Android中的靜態字段

  1. 它是不好的做法,使用靜態字段傳輸數據 活動與片段之間?對我而言,這比在意圖中使用 臨時演員要容易得多。

  2. 當我們的 可以使用靜態字段對應用程序上下文進行一點訪問時,爲什麼很多程序在構造函數和方法中使用上下文作爲參數? 例如:

    public class ApplicationLoader extends Application { 
    public static volatile Context context; 
        @Override 
        public void onCreate() { 
         super.onCreate(); 
         context = getApplicationContext(); 
        } 
    } 
    

所以有人可以解釋,在這種情況下應該使用安卓(我的意思是類如適配器,列表,背景等)的靜態字段?當使用非靜態字段,getters/setters時,額外的意圖是更好的方式,然後靜態字段?

+3

因爲全球國家是純粹的邪惡。事實上,如果你谷歌這句話,第一個鏈接給出了一個很好的解釋。 – Ordous

回答

3

在活動和片段之間使用靜態字段傳輸數據是不好的做法嗎?

一般來說,是的。在使用靜態數據成員時肯定有Android模式,但對於「傳輸數據」,它們很少被使用,因爲在大多數編程語言中全局變量被認爲是不好的形式的所有經典原因。

主要的例外是,當活動在同一個應用程序中要傳遞的數據太大而無法進入額外的數據類型或不能進入額外的數據類型。即使這樣,你最好用更靈活的方法(例如,有一個對象緩存的靜態單例管理器,你擁有共享數據,在這裏你使用extras傳遞ID或密鑰來訪問緩存)。

對我來說,這比在意圖中使用臨時演員要容易得多。

您不使用附加功能從活動傳遞到片段,反之亦然。至多,您可以使用額外功能作爲活動之間傳遞數據的一部分。

除此之外,太多缺乏經驗的開發人員都非常看重今天對「明日所有痛苦總和」的痛苦。換句話說,全局變量的使用已經一次又一次地證明了隨着時間的推移減少程序的可維護性。你現在可能不在乎。你的同事關心。你的老闆很在乎。當您嘗試維護您今天編寫的代碼時,您將關心的未來。

當我們可以使用靜態字段來訪問一個應用程序上下文嗎?

除了其他原因之外,常常會使用錯誤的Context。僅當使用Application實例時,您知道正好是爲什麼使用Application實例是正確的Context爲情況。例如,從Application(例如,通過LayoutInflater)創建用戶界面通常會給您提供錯誤的結果。

This epic blog post by Dave Smith有助於概述不同類型的Context的作用。

在哪些情況下應使用靜態字段的Android

避免在可能的地方。在需要的地方謹慎使用它們。請記住,當您的應用程序不在前臺時,您的進程可以在任何時候終止,因此,如果您不想丟失該數據,則靜態數據成員需要成爲以持久方式存儲的數據的緩存。

我的意思是類如適配器,列表,背景等

假設由「名單」你的意思是ListView,使用靜態數據成員不適合如有此種情況,恕我直言。

5
  1. 它是不好的做法...

是。 ActivityFragment是瞬態對象。他們來來去去。在Activity的情況下,它在需要時由框架自動創建。您的應用可以同時創建多個相同類的實例,具體取決於您設計應用的方式以及用戶任務/返回堆棧的狀態。在這些情況下,對單個Context進行跟蹤的static會破壞應用中的內容。

  • 爲什麼許多程序使用上下文...
  • 這是因爲Context對象的性質。這是Android中最令人困惑的事情之一。並非所有Context對象都是相同的。從getApplicationContext()返回的Context是您的應用程序的單例;但是,每個ActivityService實例都是Context的單獨實例,並且是瞬態的(請參見上文)。對於一個偉大的解釋,看到戴夫·史密斯這篇大文章:http://possiblemobile.com/2013/06/context/

    +0

    請注意,您應該永遠不要嘗試訪問來自其他活動的活動中的某些內容,並在活動中使某些內容靜態化,否則會導致內存泄漏。 – Simon

    0

    @google,

    1. 靜態變量顯示你意想不到的behavior.Some時候,它是免費的內存分配和一定的時間不是。所以它不可靠,而 額外存儲變量捆綁,所以它可靠。

    2. 因爲上下文是活動
    的 「BaseClass的」

    的和非常重要閱讀本useful guideline使用靜態和吸氣/設定器的。

    如果有任何問題讓我知道。