Android TransactionTooLargeException 積累到頂點就爆了

了解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