2012-10-08 20 views
0

我有一個使用PagerAdapter的單個活動應用程序。在OnCreate事件中,我觸發了PagerAdapter中所有7個頁面的膨脹。各種頁面都有標準的小部件,一個頁面有一個谷歌地圖。在AVD測試中,這一切都很好。OnCreate onResume和onRestart問題

但是,如果我的應用程序被暫停或停止並重新啓動或重新開始呢? pageradapter中所有頁面的通脹是否會被刪除?我是否必須再次重新填充所有頁面?

更一般...

我讀了很多關於會發生什麼與我的應用程序被停止或暫停和我應該在重新啓動時做或恢復,但我還沒有看到一個準確的會計文章什麼需要重建,哪些不需要重建。我讀到「這是刷新UI的好地方」,但我不確定這意味着什麼。

乞討問題可能是...

是我的內部狀態恢復了我的變量,sqlLite數據庫,文件內容即值。

是我恢復的小部件中的值,即文本框中的字符。

如何防止腐敗,如果暫停或停止在一箇中間的循環或代碼塊發生呢?

感謝, 加里

回答

2

但是,如果我的應用程序被暫停或停止並重新啓動或重新開始呢? pageradapter中所有頁面的通貨膨脹是否被刪除?做 我必須再次刷新所有頁面?

如果應用你的意思是Activity,當暫停這只是意味着它不是聚焦Activity現在。所有的州仍然存在。這基本上意味着你不能接受任何前景事件,直到onResume()。如果操作系統決定調用onSaveInstanceState(),則可以實際存儲諸如實例變量的值或僅用於新實例讀取的標誌的內容。雖然你不能在這裏存儲複雜的東西。因此,例如ThreadCursor實例將不合適。基本上任何不是「數據」的東西。

在活動被破壞甚至被殺害的過程,然後是你將需要重新綁定和reinflate一切情況。然而,這樣的美麗,在大多數情況下,你不必做任何特別的事情。只有在您可能寫入onSaveInstanceState()的捆綁包的情況下,您才需要做一些額外的工作。

是我的內部狀態恢復即我的變量值,sqlLite數據庫,文件內容。

如果過渡只在onPause和onResume之間,那麼是。一切都應該沒問題。如果發生銷燬或進程終止,則活動將以onCreate()重新啓動,並且必須根據Bundle savedInstanceState重置所有狀態。我將在晚些時候處理sqlite和文件。

是我的小工具中恢復的值,即文本框中的字符。

通常,如果他們saveEnabled(true)(大部分做)和TextView有一個freezesText物業,這將使他們記住最後文本對他們設置。但是,大多數情況下,如果您在onSaveInstanceState()調用期間正確保存您的狀態,則很可能您不僅將狀態存儲在UI中,而且還存儲其他方法。在這種情況下,你可能也同步他們當你去通過未來onCreate()

如何防止腐敗,如果暫停或停止可以在 中的for循環或代碼塊發生呢?

因此onPause()onStop()發生在主UI線程上。如果您當前正在UI線程上運行代碼,則必須先完成這些其他回調才能發生。如果您正在其他線程上運行,那麼您必須嘗試在UI線程上完成任務完成的輸出。它簡化了很多。

殺死另一方面,可能會發生。儘管當我們談論腐敗時,這通常會影響程序內存之外的事情。就像你打開文件句柄或打開sqlite光標或打開網絡套接字一樣。這樣,你必須在使用之前檢查狀態。

  • 確保目錄是否真的存在你讀或寫他們
  • 確保文件的內容是正確寫入之前(簡單預期的檢驗和通常在這裏工作或版本的元數據)之前, 。
  • 在使用sqlite時使用事務,以確保您只用完整的原子塊將數據寫入表中,這樣您就不會有其他表中不存在行的表引用行。
  • 網絡連接將被重置,並且類似您的網絡協議選擇應該照顧您的理智檢查,以及正在連接的應用程序。

希望這可以幫助,雖然它不完全,但它是一個很好的開始方法。

+0

感謝格雷格您的非常完整的答案。 –

0

在狀態暫停和停止所有的對象都保留,你不必擔心中斷的循環,除非它需要超過5秒即可完成,其可能產生ANR的。

然而,是很好的做法,當進入這些狀態realease不需要的或可重新伊斯利的對象,特別是如果他們使用的內存量較大,且reentring狀態恢復或重新啓動時重新創建。

當你的appliaction進去消滅狀態,那麼所有對象都將丟失。