我更新了Nexus5X到安卓N,现在当我在上面安装应用程序(调试或发布)时,我在每个屏幕过渡中都会得到TransactionTooLargeException。这款应用程序在所有其他设备上都能正常工作。在PlayStore上运行的代码基本相同的旧应用程序在Nexus5X上也可以运行。有没有人有同样的问题?
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 592196 bytes
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3752)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: android.os.TransactionTooLargeException: data parcel size 592196 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:615)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3606)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3744)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
发布于 2017-09-23 14:39:19
做了一次打击和试验,最终解决了我的问题。将此代码添加到您的Activity
@Override
protected void onSaveInstanceState(Bundle oldInstanceState) {
super.onSaveInstanceState(oldInstanceState);
oldInstanceState.clear();
}
发布于 2017-04-04 04:14:30
TransactionTooLargeException已经困扰我们大约4个月了,我们终于解决了这个问题!
发生的事情是,我们在ViewPager中使用FragmentStatePagerAdapter。用户可以翻页并创建100+片段(这是一个阅读应用程序)。
尽管我们在destroyItem()中正确地管理了片段,但在FragmentStatePagerAdapter的Androids实现中存在一个错误,它保留了对以下列表的引用:
private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
当安卓的FragmentStatePagerAdapter试图保存状态时,它将调用该函数
@Override
public Parcelable saveState() {
Bundle state = null;
if (mSavedState.size() > 0) {
state = new Bundle();
Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()];
mSavedState.toArray(fss);
state.putParcelableArray("states", fss);
}
for (int i=0; i<mFragments.size(); i++) {
Fragment f = mFragments.get(i);
if (f != null && f.isAdded()) {
if (state == null) {
state = new Bundle();
}
String key = "f" + i;
mFragmentManager.putFragment(state, key, f);
}
}
return state;
}
正如您所看到的,即使您正确地管理了FragmentStatePagerAdapter子类中的片段,基类仍然会为所创建的每个片段存储一个Fragment.SavedState。当数组被转储到parcelableArray,并且操作系统不喜欢它100+项时,就会发生TransactionTooLargeException。
因此,我们的解决方法是覆盖saveState()方法,并且不存储任何“状态”。
@Override
public Parcelable saveState() {
Bundle bundle = (Bundle) super.saveState();
bundle.putParcelableArray("states", null); // Never maintain any states from the base class, just null it out
return bundle;
}
发布于 2017-06-14 16:36:33
我在我的Nougat设备上也遇到了这个问题。我的应用程序使用一个包含4个片段的带有视图分页的片段。我将一些大的构造参数传递给了导致问题的4个片段。
在TooLargeTool的帮助下,我追踪了导致这个问题的Bundle
的大小。
最后,我在POJO对象上使用putSerializable
解决了这个问题,该对象实现了Serializable
,而不是在片段初始化期间使用putString
传递大型原始String
。这将Bundle
的大小减少了一半,并且不会抛出TransactionTooLargeException
。因此,请确保您不会向Fragment
传递过大的参数。
谷歌问题跟踪器中与P.S.相关的问题:https://issuetracker.google.com/issues/37103380
https://stackoverflow.com/questions/39098590
复制相似问题