2011-11-30 244 views
0

我需要在活動之間傳遞我的對象列表。我不想每次都使用parcelable或序列化數據。我也不想將它保存在本地文件或數據庫中。這可能使我使用靜態對象。在活動之間傳遞/使用非原始對象

可以說我在活動Activity1到Activity2之間使用ListA。方法1:在其中一個活動中創建一個靜態ListA,並完成所有靜態ListA的工作。

方法2:在另一個類中創建一個靜態列表,我只用它來存儲這個列表並在列表中完成所有的東西。但是這意味着只要我的進程正在運行,它就會一直存在,而當我不需要它時,我必須手動將其設置爲空。

方法3。我正在擴展上面的類來使用靜態HashMap來實現它。 我有兩種方法之一,使用唯一鍵將靜態HashMap中的列表存儲起來,另一種方法是檢索列表並在每次檢索數據時將其刪除,以便List不再出現在靜態HashMap中。所以我們必須只傳遞生成的隨機密鑰來存儲活動之間的數據,我可以使用Intents作爲額外的數據傳遞。

當我使用上述任何一種方法時,會有什麼問題,哪種方法最好。

回答

1

Uggg statics!我希望所有的開發人員都明白全局變量是不好的,他們是如何讓你的程序變得更脆弱的,以及你的人生如何。我們一直在談論他們30多年來有多糟糕,但不幸的是,除非他們完全沉浸在他們身上,否則沒有人會想到這一點。

首先我會說序列化你的數據很快。有很好的工具可以快速序列化你的對象,你可以使用我喜歡的http://flexjson.sourceforge.net

所以,如果你只是徹底反對這一點,你可以通過繼承它,聲明你實現你的Android清單通過應用程序通過這個對象,每個活動都有訪問應用實例:

public class MyActivity extends Activity { 
    public void onCreate(Bundle bundle) { 
     MyApplication application = (MyApplication)getApplication(); 
     Object anInstanceFromAnotherActivity = application.getSomeInput(); 
    } 
} 

這個缺點是當你的應用程序被回收,如果用戶返回到你的應用程序的內存已經消失,並且你不能得到你可能需要的屏幕輸入。 Android框架試圖讓你序列化包中的東西,因爲如果它決定銷燬你的應用程序,你總是可以從包中重建自己。現在有些捷徑可以像重定向人員重新開始,如果應用程序已被回收,但是這些捷徑取決於您的程序以及它們在有意義時的行爲。

這就是使用序列化勝過所有其他形式的持久性(可添加,文件,數據庫)的地方,因爲它可以在一行代碼中完成。

+0

+1爲你的第一段「Uggg statics!...」無論如何可以說我想現在堅持靜力學,你能否評論我的做法3。我從地圖中移除靜態對象,不應該再出現。而且我確實考慮過你提到關於android釋放內存的情況。我處理該問題,並簡單地關閉我的活動,用戶可以再次請求數據。謝謝。 – achie

+1

順便說一句,這個解決方案有一個catch ..你不僅要擴展活動,你還必須擴展你使用的其他基本活動,如「ListActivity」,「PreferenceActivity」等,並有這個邏輯複製在那裏... – havexz

+0

@ havexz沒有趕上。無論你是子類Activity還是Activity的其他子類,這都會起作用。這裏的想法是,你不會在所有活動中共享設置/獲取代碼,因爲每個活動傳遞的內容可能有所不同,因此共享不會對你有多大好處。我想你正在考慮一些其他問題。 Acitivity.getApplication()方法可用於Activity的所有子類。 – chubbsondubs