我的主要活动有时会遇到这个令人讨厌的异常。堆栈跟踪是这样的:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tomatedigital.lottogram, PID: 4430
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 543588 bytes
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4156)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: android.os.TransactionTooLargeException: data parcel size 543588 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:761)
at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:5147)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4148)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
跟踪本身不是很有帮助,因为它没有指定与异常相关的组件或事务ID或标记(Google请考虑您放置在此处的废话的可调试性)...但我确实怀疑这是我主要活动中的recycleview。
此资源回收视图可能超载,数千个项目。它们每个都包含:3个小字符串,1个大字符串和一个小位图。
当此recyclerview超载且活动被暂停时,将引发此异常。由于创建了recyclerview,它会放大layout.xml,因此android会自动保存其状态。
是否有任何简便的方法来解决此问题?是否可以将应用设置为允许“超大交易”?我该怎么办?
================更新===================提供有关我的活动的附加信息
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putSerializable("media", this.media); //this is a domain class
outState.putBoolean("canceled", this.canceled);
outState.putInt("speed", this.speed);
outState.putLong("startTime", this.startTime);
outState.putSerializable("comments", (Serializable) this.adapter.getList()); //this is the large data
outState.putBoolean("commentLoadComplet", this.complete);
outState.putSerializable("fetched", (Serializable) this.fetched);
outState.putSerializable("igiboAttendees", (Serializable) this.igiboAttendees);
outState.putLong("winnerId", this.winnerId);
super.onSaveInstanceState(outState);
}
这通常是由于将大量数据保存在onSaveInstanceState中,不仅是针对发生异常的活动,还包括当前在后堆栈中的其他活动。
一种解决方案是使用ViewModel类来维护状态,而不是onSaveInstanceState:
您仍然可以使用onSaveInstanceState处理少量数据,但是请记住,它会加总所有活动。