AndroidでFatal Exception: java.lang.RuntimeException android.os.TransactionTooLargeException: data parcel size N bytes
- 2018.09.20
- Android
現象
- クラッシュレポートサービスに
Fatal Exception: java.lang.RuntimeException
というエラー。
android.os.TransactionTooLargeException: data parcel size 719044 bytes - 具体的にどんなタイミングで起きているかは不明
- ぐぐると、画面回転時とかIntent時putExtraで大きめデータやりとりとかEditTextとか出てくるけどどれも該当せず。
条件
- compileSDK:26
- targetSDK:26
- 落ちているとレポートがきたOS:Android N, O(7と8)
原因
- とりあえずやりとりするデータ上限1MBを超えるとOS N(7)以上では落ちてしまう ※機種によっては1MB以下でも落ちる
対策
- FragmentStatePagerAdapterを用いたViewPager実装をしている場合、バグがありリストへの参照を保持し続けるらしい ※FragmentPagerAdapterはsaveStateがNullなので以下の方法だと落ちます。注意。
- saveState()メソッドをオーバーライドし、 “states”にNullを入れて何も格納しないようにする
1 2 3 4 5 6 7 8 9 10 |
@Override public Parcelable saveState() { Bundle bundle = (Bundle) super.saveState(); if (bundle == null) { bundle = new Bundle(); } bundle.putParcelableArray("states", null); // Never maintain any states from the base class, just null it out return bundle; } |
まとめ
日本語で同じ問題の記事にたどり着けなかったので書いてみましたが、あまりViewPagerとFragmentStatePagerAdapterの組み合わせって使われていないのだろうか
-
前の記事
AndroidでFatal Exception: android.app.RemoteServiceException 2018.09.19
-
次の記事
Kotlin移行1 2018.09.25
コメントを書く