2010-11-17 30 views
6

我在Android/Java編程方面相當新,所以一些基本的東西仍然很混亂。因此,假設我的應用程序從外部XML文件中獲取所需的所有數據(文章),它將它們解析爲數據模型(文章類),並且這些文章將被用於整個應用程序中(用列表或單個文章顯示)生命週期。我應該在哪裏全局保存/緩存所有應用程序生命週期所需的數據?

我應該在哪裏?我可以使用包含我已解析的所有文章的數組創建單例類嗎?還是應該將它們保存到數據庫,然後根據需要進行查詢? (這聽起來像太多的工作,我不需要現在緩存它們)這裏最好的做法是什麼?

回答

2

將它們保存在Application中。這是任何Android應用程序的基類,它在應用程序的整個生命週期中都處於活動狀態,而活動在未顯示或方向改變時被終止。

您的AndroidManifest.xml中聲明android:name

<application android:name=".YourApplication"/> 

編輯:

這也是相關的:How do I pass data between Activities/Services within a single application?

+0

這不會讓主類變得混亂嗎?特別是,如果我將更多的數據(數組)和專用於管理(添加,更改,搜索)數據的方法。 – sniurkst 2010-11-17 09:49:30

+0

這是您的設計決定。我只是說可以從所有活動訪問應用程序,並且是存儲與應用程序生命週期(而非活動生命週期)相關的共享數據的正確位置。 – 2010-11-17 09:52:17

+0

您可以將數據直接放入應用程序中,或者將其放入專門的類中並在應用程序中引用它。 – 2010-11-17 09:53:27

1

那要看什麼是您的編程風格笑。

你可以像你說的那樣創建一個會讀取你的xml並存儲所有東西的單例。

你可以在你的類中創建一個靜態哈希。這樣當你創建一個新的對象時,你將有權訪問該類的靜態信息。

您可以將類的信息作爲參數傳遞給類。

如果你想讓我們告訴你哪一個是最好的,如果不知道你的程序的體系結構將會很困難。

例如,您可以有一個視圖控制器來處理任何更改,然後在切換視圖時將該數據存儲在該級別可以很簡單。

你可以有靜態視圖,你可以直接設置所有的值,當你打開它們。

你可能會losely鏈接相互調用的觀點沒有任何控制器來處理交換和在這種情況下,你可能會喜歡有一個方法來收集你從一個單身或靜態方法所需要的信息...

+0

那麼,理想情況下,我想有一個類:所有活動都可以訪問,存儲一個對象數組,並且能夠管理該數組(添加更多對象,通過數組中的位置或某種類型獲取對象如果這讓我的問題更清楚。 – sniurkst 2010-11-17 09:47:37

0

只要確保沒有任何線程作用於共享數據,您就可以使用靜態成員創建一個靜態類。每個活動都可以訪問它。如果爲數據使用異步下載,則可以在處理程序的onPostExecute中觸摸GlobeVars,因爲它在UI線程上運行。

public class GlobalVars { 
    public static String userId = "?"; 
    //public static String serverUrl = "10.0.2.2"; //localhost when developing 
    public static String serverUrl = "192.168.1.4"; //on device to laptop 
    //public static String serverUrl = "102.192.293.10"; //production 
    public static Book currentBook = null; 
    public static Chapter currentChapter = null; 
    public static int lastclickedChapter = -1; 
    public static Voice currentVoice = null; 
    public static String catalogJson = ""; 
    public static ArrayList<Book> catalogItems = null; 
} 

MainActivity中的onCreate我可以將目錄設置爲coverted對象XML的我的下載列表

GlobeVars.catalogItems = downloaded xml to object list 
在我的子活動

這是章節列表中onclicklistener我可以設置:

GlobeVars.currentChapter = items[clickeditem]; 

當您返回到主要活動時,值仍將被設置。

相關問題