2011-05-28 221 views
4

相當長的一段時間,我非常幸福,只要應用程序運行,靜態[實例]變量就存在。然而,令我感到沮喪,並且非常驚慌,我覺得這不是真的。靜態(類)變量的生存期

僅用於測試,我創建了一個靜態的字符串列表,並在我的主activity類中覆蓋了onDestroy方法來打印消息以驗證應用程序已退出。在onCreate方法中,我簡單地添加了一個新的string,並打印了列表中的內容。我發現的是,列表的大小不斷增加,以前添加的所有字符串值仍然存在。

我讀過的地方[甚至在這裏]實例變量存在,只要應用程序,但我擔心它不是真的如此。

更準確地說,我在使用Facebook SDK for Android時意識到了這個問題。我已經看到SessionEvents類中聽衆列表中的AuthListener實例隨着時間的推移而不斷增加。因此,無論何時啓動應用程序並且用戶使用FB登錄,監聽器方法都會觸發多次,因爲SessionEvents類中存在實例。

有人曾經觀察過這個,有沒有一些主要的錯誤,我承諾瞭解Android的工作原理?

是什麼給出的?

感謝您的閱讀!

[UPDATE]
我支持BalusCrdineiu校正。我真的不想在這裏對實例和類變量產生困惑。唉,我急於發佈我的問題,我犯了一個我不想做的錯誤。我非常清楚staticinstance變量之間的差異。我只是打算編寫class變量,並且不能完全弄清楚將靜態變量引用爲instance變量。

但是,我的問題依然存在。 @MisterSquonk - 不,我不會在這裏混淆關於何時我的Activity結束以及應用程序被破壞的情況。以下是我在示例中嘗試的內容 - 我只有一個Activity,它的作用是Main。當我按下這個Activity的後退按鈕時,我假設Activity從堆棧中被移除,該應用也被破壞。我已經啓動了任務管理器來驗證我的應用程序不再運行。

+6

靜態變量!=實例變量 – BalusC 2011-05-28 19:23:23

+2

與您的問題沒有直接關係,而是參考您所說的內容......「在我的主要活動類中,覆蓋了onDestroy方法以打印消息以驗證應用程序已退出」 - Don'不要將活動與應用程序混淆。殺死活動並不一定會殺死應用程序(「應用程序」)。 – Squonk 2011-05-28 19:48:40

+0

@MisterSquonk - 不,我沒有任何混淆。在我的特定應用程序中,我非常肯定,「活動」的殺死也意味着應用程序不再運行。我使用任務管理器對其進行了驗證,並且更新了帖子以提及相同的內容。 – anirvan 2011-05-28 20:28:12

回答

5

所以 - 我在Android開發人員Google小組上發佈了同樣的問題[不幸在static變量中聲明瞭static變量爲instance變量]。

我收到了一些非常好的回覆,特別是從Kostya。我在該團隊的互動幫助我掌握了Android平臺的基本「規則」。

希望message thread可以幫助你。

6

你似乎沒有區分靜態變量和實例變量。靜態變量在類本身上定義。實例變量僅存在於類實例中。

實施例:

class Test { 
    public static int a; 
} 

可變a被限定在類本身,而不是在類的實例。每個實例將訪問相同的變量。如果有一個實例將a的值設置爲5,則每個其他實例的值都將顯示爲5。一旦實例消失,該變量不會消失,因爲它不會與任何實例綁定(它是類變量)。它會一直持續到時間結束(或者直到申請退出,以先到者爲準)。

在另一方面,下面的例子使用一個實例變量:

class Test { 
    public int a; 
} 

此變量將被訪問只能從實例的類的。每個實例都有一個不同的變量副本。一旦實例被破壞,變量就會隨之消失。


舉例說明:當應用程序做但有些GUI小默認保存其狀態,然後它onCreate方法恢復

import java.util.List; 
import java.util.ArrayList; 

class Test { 
    // instanceVar will be initialized whenever a new Test object is created 
    private List<Integer> instanceVar = new ArrayList<Integer>(); 

    // staticVar will be initialized right now 
    private static List<Integer> staticVar = new ArrayList<Integer>(); 

    public void updateInstanceVar() { 
    instanceVar.add(1); 
    instanceVar.add(2); 
    } 

    public void updateStaticVar() { 
    staticVar.add(1); 
    staticVar.add(2); 
    } 

    public static void main(String[] args) { 
    Test test1 = new Test(); 
    test1.updateInstanceVar(); // test1.instanceVar = [1, 2] 
    test1.updateStaticVar(); // Test.staticVar = [1, 2] 

    Test test2 = new Test(); 
    test2.updateInstanceVar(); // test2.instanceVar = [1, 2] 
    test2.updateStaticVar(); // Test.staticVar = [1, 2, 1, 2] 
    } 
} 
+0

謝謝你指出,是的 - 你是絕對正確的。然而,正如我對帖子的更新所表明的,我希望我的問題的意圖不會因爲我犯下的愚蠢錯誤而丟失。 – anirvan 2011-05-28 20:26:39

0

實例變量被破壞。