2013-10-27 45 views
0

我有序列化的問題。可繪製的可串行化或不是或有時?

我有一個HomeHolder對象,它爲我的HomeFragment保留了一些數據。 HomeHolder由1個String,2個String的HashMap的ArrayList和1個包含2個String和2個Drawable的MediaHolder對象組成。

當我旋轉我的設備時,我想恢復包含在我的HomeHolder中的數據。所以我嘗試在我的HomeHolder和MediaHolder中實現Serializable接口。我很確定Drawable不是可序列化的,但是讓我們嘗試...

我把我的HomeHolder作爲一個Serializable對象包含saveInstanceState活動的方法,該方法持有我的HomeFragment(是的,我需要使用這個HomeHolder在其他片段,HomeFragment,所以我保留它在我的活動),並恢復它與onRestoreInstanceState

好吧,現在我將旋轉我的HomeFragment和驚喜:它的工作! (不要問我爲什麼)。數據不是從網站加載,而是從我的HomeHolder中恢復。 現在我點擊一個ImageView(例如)啓動一個新的活動。哦,再次驚喜:應用程序崩潰......我的Mediaholder中的Drawable對象似乎變得不可序列化。

所以我的問題是:Drawable Serializable,NotSerializable或SometimesSerializable? (我可以給你一些代碼,但它是沒用的:這只是經典的對象與getter/setter和經典的onSave/onRestore實現)。

編輯:我看到調試器,當我旋轉或當我點擊ImageView時,我的HomeHolder對象完全相同。沒有東西是空的。

回答

0

你應該守住可繪過去的,他們的主人活動的整個生命週期,請參閱相關Google documentation

注意:雖然你可以返回任何對象,你不應該傳遞一個 對象,綁定到活動,例如Drawable,適配器,視圖或任何其他與上下文關聯的對象。如果你這樣做, 它會泄漏原始活動 實例的所有視圖和資源。 (泄漏資源意味着你的應用程序維護上他們 保持,他們可以被垃圾收集,所以大量的內存 可能會丟失。)

正確的方法是隻保存屏幕狀態,並重新創建新屏幕使用屏幕狀態,並重新加載其餘數據。對於您的網頁加載數據,您可以將它們保存爲內存中的原始數據或Bitmaps緩存。位圖和Drawable之間最大的區別在於Bitmap不受任何上下文限制,因此可在任何地方使用。

方法來提高屏幕旋轉速度,檢查這個谷歌博客:Faster screen orientation change

+0

是的,我想我應該不會......這只是一個嘗試,我會用自己的方式做,但我不明白爲什麼它在輪換工作,而不是當我離開活動時。 Thx的答案和細節:) – QLag

相關問題