2017-03-01 59 views
0

如果我有一個包含一個靜態變量的一類,說X:安卓:靜態變量和動態複雜的數據

class MyClass { 

    static boolean x = false; 

    // Other methods 

} 

現在讓我們說,假設,我設置x = true;從我的第一個活動。由於「Google JVM」或Android環境的工作原理,我的應用程序的其餘生命週期(包括各種活動和線程)是否有任何意義,這個值很容易被重置爲false?我聽說過,靜態變量有一個'終身',當程序死亡時就會死掉。活動是否被視爲單獨的「程序」?服務怎麼樣?甚至Widgets?

我在問這是因爲在android中由於'分離'活動是如何分離複雜數據結構並且依賴於其他複雜處理(如同步在線數據庫中的數據)通常很困難,而靜態變量通常是非常快速和骯髒的解決方案的問題。我嘗試過的其他事情包括序列化,但這似乎並不是一個實際的解決方案(當用戶從​​一個活動導航到下一個活動時,不斷序列化和解碼對象,看起來會非常耗費資源)。

如果我是這樣做的惡人,請告訴我我做錯了什麼,甚至更好,給我一些鏈接或更好的方法來解決這個問題的例子。

+0

那麼你還沒有真正解釋你需要的價值 –

+0

你需要在活動之間傳遞數據嗎? – Remario

+0

一旦應用程序死亡,x將重置。 –

回答

1

Yes. There are times where that will reset.主要是如果用戶離開應用程序並開始擺弄其他應用程序,或者用戶讓手機長時間進入休眠狀態。 Android進程可能會殺死實際的應用程序。然後,當用戶回來時,應用程序的「狀態」將被恢復,但是靜態變量將處於默認狀態,因爲實際進程已被重建。

通常在活動和服務之間傳遞小對象是通過覆蓋Parcelable接口完成的。這將允許您使用setOnInstanceState方法同時保存和恢復對象活動,視圖和一些適配器。他們也會有一個恢復方法,您可以在其中重建對象。可序列化優於可序列化。

根據您想要同步的數據,較大的數據可能需要共享文件或數據庫。活動之間傳遞的可加載項的大小限制爲1 MB。一種常見的策略是將信息保存到文件中,並將URI發送到可以檢索信息的位置。

+0

因爲這是我的主要問題的答案,我認爲這是最終答案。感謝大家的貢獻。 –

+0

@Campbell:煩人的是不得不經常反序列化/重新序列化所有東西。它通常不會很長(毫秒),但如果時間更長(即非常大的圖像),那麼您可能需要考慮重構和分解數據,或根本不使用多個活動。 「碎片」通常可用於單個活動,並且在它們之間共享數據要容易得多。 – DeeV

0

不,一個靜態變量不會被改變,除非你改變它或應用程序結束,它是安全的(但通常不乾淨)使用它。關閉變量所在的活動不會傷害它。

你建議你只需要跟蹤活動中的價值。在這種情況下,您可以將Intents中的值添加爲所謂的「額外」。如果您需要後,也傳回值,機器人還具有startActivityForResult功能

意圖演員例如:

低於X可以是任何類型的值,包括它實現Parcelable

Intent intent = new Intent(...); 
intent.putExtra("myKey", x); 
startActivity(intent); 

任何對象在接收類:

x = getIntent().getBooleanExtra("myKey"); 

編輯:

鑑於您的其他評論 - 「包含更多對象列表的對象列表」,您可能會在試圖使用額外功能時遇到Parcel太大的異常,但這表示您有更大的體系結構問題,是更好的方法

+0

對不起,我的問題不清楚;重寫:Intents只允許你在活動之間傳遞原始數據類型,但是我想通過我的應用程序訪問大量的對象列表。 –

+0

不,他們沒有。一點也不。他們支持列表,自定義對象,原語...甚至包含其他自定義對象的自定義對象列表 –

+0

是的,但這是有效的序列化,但是,而不是你明確地做,而是代之以做。 https://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String,java.io.Serializable) –

0

使用Gson。 Gson是一個Java庫,可用於將Java對象轉換爲其JSON表示。它也可以用來將JSON字符串轉換爲等效的Java對象。 Gson可以使用任意Java對象,包括您沒有源代碼的預先存在的對象。

您有兩種選擇。轉換爲字符串,然後將數據放入一個意圖,然後傳遞給活動。或者使用gson轉換爲字符串,保存爲首選項,然後在其他活動中檢查首選項是否處於活動狀態並從中讀取。

如果您希望大膽,可以堅持使用Realm for Android數據庫,或者ObjectBox是針對性能優化的新移動對象數據庫。通過ObjectBox,我們將NoSQL服務器數據庫技術引入移動設備。

+0

如果我有大量的數據,這不會過時嗎? –

+0

定義了很多? 30mb以上 – Remario

+0

然後第二個選項是要走的路,轉換爲字符串,保存爲共享偏好,並收集到其他活動中。 – Remario

1

回答您的問題 - 是的,當您設置x = true並且值將被重置爲false時會出現這種情況。那麼,不完全重置,但考慮這種情況:你有一個活動和一個服務。服務使用單獨的過程(您可以在您聲明服務時在AndroidManifest中定義該過程)。然後,這兩個進程(主應用程序和服務)將不共享內存,並且在您的活動中將x設置爲true不會影響服務中MyClass.x的值。在所有其他情況下,在一個地方改變價值將在其他地方可見。希望能幫助到你!