2013-02-08 116 views
2

我正在開發一個Android應用程序,並且我希望避免在使用相同額外的相同活動來源時重新加載類似數據。在Android中保存同一活動的多個實例狀態

具體來說,當我用額外啓動我的活動'A'時,我使用這個額外的來從服務器加載遠程數據。 從這個活動中,我可以重新啓動不同額外的'A'等等。

例子:

答:ID1 - >答:ID2 - > A:ID3

但是,它也可以是一個額外的,我已經裝:

答:ID1 - >答:ID2 - >答:ID3 - >答:ID1

在這種情況下,我不會再要求服務器或失去活動疊加。根據我的理解,「onSaveInstanceState」允許保存一個Activity的一個實例,但在我的情況下,它是同一個Activity的多個實例(帶有不同的額外值)。

那麼,它是爲同一個活動管理已保存實例狀態(包)的列表的解決方案嗎?或者是其他東西 ?

在此先感謝

回答

3

onSaveInstanceState方法是不是在你所描述的方式使用。 Check this out,它是活動類的文檔,特別是活動生命週期部分。 onSaveInstanceState是一種在操作系統由於某種原因必須殺死一個Activity時被調用的方法。它允許您填充一個Bundle,它將幫助重新創建用戶停止的Activity的特定實例。通常發生這種情況的原因是用戶切換到不同的應用程序,操作系統正在殺死活動來回收內存,但也發生在屏幕旋轉,所以這是平臺的一個細微之處,至少要知道的重要。

至於你的問題,我會做的是使用數據庫來存儲從服務器檢索到的信息。當您啓動一個活動時,您可以先檢查數據庫中是否存在需要填充該活動的數據。如果是這樣,從那裏加載並顯示它,否則進行服務器調用。

這很好,因爲數據將持續多次使用該應用程序。進一步來說,如果服務器的數據可能會過時,那麼可以很容易地擴展它,以便最初顯示數據庫中的數據,並引發對數據的異步請求,以在數據返回時更新UI和數據庫。你的用戶幾乎永遠不會處於等待加載的狀態,這總是一件好事!

Here's a good tutorial on the basics of implementing an sqlite database.這也將給你額外的好處,保持數據存儲在單獨的應用程序運行。

作爲一種替代方案,如果您不真的需要數據庫的持久性或其他功能,並且不認爲開銷是值得的,那麼可以創建一個Singleton類,用於跟蹤返回的數據,也許使用Application class來實現它。重要的是要注意(並且帶給我們整整一圈),任何存儲這種數據的內存方法都應該使用onSaveInstanceState進行管理,以確保在活動在意外時間被殺死時不會丟失任何數據。

+0

首先,謝謝你的回答。現在我明白了onSaveInstanceState的好處。 我曾經想過要保存數據(例如在數據庫中),但是,有一件事我沒有提前指定。我收到的一些數據是API提供的圖片,根據使用條款,我沒有權限存儲它們。這就是爲什麼,我試圖恢復視圖而不是數據。 – Barles 2013-02-08 16:01:25

+0

我明白了。圖像非常棘手,無法將它們保存到磁盤上會限制您的選擇。有些事情要注意的是,圖像(特別是Bitmaps,如果這就是你正在使用的)會佔用大量內存,並導致OutOfMemoryException異常,這種情況太臭了。最好將所有可以存儲在數據庫中的數據存儲起來,然後每次需要映像時都可以創建一個新的API調用。正如我提出的一種替代解決方案,您可以嘗試某種類型的緩存,但這樣做會更有效,並且可能會引入不穩定性。 – MattDavis 2013-02-08 16:13:01

+0

是的,我會嘗試存儲所有我可以並依靠[Android通用圖像加載器](https://github.com/nostra13/Android-Universal-Image-Loader)來管理緩存圖片的數據。 – Barles 2013-02-08 22:22:36

0

+1對於MattDavis的回答,但我也建議你使用所謂的「單身模式」。

本質上,這是一種緩存內存中的東西的方法。您創建一個類,其目的是保存您不想繼續重新加載的所有數據庫數據。這個對象有一個全局實例,最初爲空。您調用返回該實例的靜態方法。如果靜態方法發現該實例爲空,它將創建實例,從數據庫填充該實例,將其緩存並將其返回給調用者。從這一點開始,實例的所有請求都只返回緩存副本。如果您的應用因缺乏資源而被系統殺死,並在稍後重新啓動,它會根據需要透明地重新創建實例。

這是一個很常見的實現,並在多線程環境中工作:

public class Singleton { 
    private static volatile Singleton instance = null; 
    private Singleton() { 
     // This is the place where you initialize the instance 
     // from the database. 
    } 
    public static Singleton getInstance() { 
     if (instance == null) { 
      synchronized(Singleton.class) { 
       if (instance == null) { 
        instance = new Singleton(); 
       } 
      } 
     } 
     return instance; 
    } 
} 

我用在很多地方這種模式;它非常方便。

爲了真正做到這一點,您還應該在活動中實施onLowMemory()或onTrimMemory()以在資源緊張時釋放單例實例。