2012-03-21 44 views
16

由於onRetainNonConfigurationInstance的棄用,我一直在利用框架越來越多地進行配置更改。由於我使用ViewPager來保存我的主碎片,所以我不能使用setRetainInstance,這限制了我的配置更改使用onSaveInstanceState,就像標準的Activity或View一樣。onSaveInstanceState限制?

它運行正常,沒有任何問題,但我目前正在通過一個相當大的Serializable數據集,這讓我想知道社區是否是一個好主意。

tl; dr:onSaveInstanceState對您通過它的內容有大小限制嗎?

+0

我認爲沒有。可能它使用'SharedPreferences' - 我想這個。 – 2012-03-29 01:05:07

+0

「由於我使用ViewPager來保存我的主碎片,所以我不能使用setRetainInstance」 - 爲什麼你認爲你不能在'ViewPager'中使用帶有碎片的'setRetainInstance()'?我找不到任何引用此限制的地方。有鏈接?謝謝! – CommonsWare 2012-03-31 10:19:09

+0

它根本不起作用,它可能是一個錯誤。我曾嘗試過使用'FragmentPagerAdapter'和'FragmentStatePagerAdapter',並且都沒有導致碎片與'setRetainInstance()'正確工作。當我將它們從'ViewPager'移動到類似於(見下文)的標準開關時,一切正常。 http://developer.android.com/resources/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.html – HandlerExploit 2012-03-31 13:30:38

回答

14

說出比「相當大的」更有幫助。 :)

該數據通過一個IPC,IPC限制約爲1MB。你想保持你編組的大小顯着小於那個; 100K可能是一個很好的最大值。實際上,你希望儘可能小(考慮你在那裏放置什麼,不要浪費空間),因爲即使你自己的進程被終止,這些數據也必須由系統保存在RAM中。

0

該限制是內存限制,因爲你沒有OutOfMemory錯誤,應該沒問題。

只要確保在傳遞對象上沒有任何視圖或上下文,因爲如果用戶不斷地改變方向,這會導致內存的使用迅速增長。

+0

如果應用程序被回收,它如何保存在內存中?這個信息是持久的,所以我知道它不能保存任何依賴於應用程序的內存,所以OutOfMemoryErrors當然不會出現在應用程序本身上。我明確指出我傳遞的是Serializable對象,因此不可能通過View或Context來傳遞它。但是,如果您通過onRetainNonConfigurationInstance傳遞了一個值,則會泄漏整個Activity,因此在該場景中配置更改時最終會耗盡內存。 – HandlerExploit 2012-03-29 21:26:40