了解Activity Bundle還會發生這些事!?
今天在做專案的時候遇到了
!!! FAILED BINDER TRANSACTION !!!
專案當下是在操作 webview 中連結的 in App Browser的動作~
誰想到連結到某一網站圖片過大結果crash了
後來不斷尋找才得知在開啟新Activity的過程中
原先的Activity原本就會暫存相對的資料在bundle savedInstanceState裡面
最後使用了一個lib 叫做 toolargetool,他可以在報錯的時候 列出當下Shutting down的 每一個savedInstanceState裡面所有參數與大小
附上github : https://github.com/guardian/toolargetool (最新的是kotiln版, 因應舊專案可以使用java的1.6版本)
經過重新操作報錯,看了相應的Log發現在某一個Fragment在傳遞資料的過程中 大小為1.6mb
顯然在Android記憶體中 過大了,然後在點進webview中的連結 開啟in App Browser的時候 網頁的圖片又快800kb
所以導致超過記憶體極限而發生這個crash。
最後的解決方式:
暫時使用單例class存儲該資料,不透過bundle傳遞就解決了這個問題,
雖然老實說治標不治本 但是如果有遇到緊急狀況還是很方便的。
TransactionTooLargeException 錯誤在任何時候都有可能因為你前面架構設計沒處理好導致
所以網路上很多資料雖然有各種解法,但是實際上還是要將記憶體處理得當才是,盡量避免bundle的累加讓記憶體爆掉。
ps 在使用webview 的in App Browser本來就有很多限制,治標不治本已經是常態 希望大家有更好的方式解決這個問題
歡迎從架構上到延伸的操作加以討論 感謝XD