gpt4 book ai didi

android - 启动新 Activity 时发生 TransactionTooLargeException

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:06 25 4
gpt4 key购买 nike

我认为 Intent 的额外大小限制是 1MB,如 docs 上所报告的那样.无论如何,我在追逐这个可怕的 TransactionTooLargeException 时迷失了一天:

 E/JavaBinder(368): !!! FAILED BINDER TRANSACTION !!!
Exception when starting activity android/com.android.internal.app.ChooserActivity
android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:705)
at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:690)
at com.android.server.am.ActivityStack.startSpecificActivityLocked(ActivityStack.java:799)
at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1743)
at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1381)
at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1129)
at com.android.server.am.ActivityStack.activityPaused(ActivityStack.java:1027)
at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:4288)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:381)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:1611)
at android.os.Binder.execTransact(Binder.java:367)
at dalvik.system.NativeStart.run(Native Method)

坏事是 startActivity 失败了,但 ActivityManager 不断地重新启动它,产生无限进程。这似乎在 this 上得到了证实。博客文章,其中作者指明了 86389 个字符的“限制”。我的相关代码非常简单:

                    Intent myIntent = new Intent(activity, VacancySwipeActivity.class);
//myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Bundle ex = new Bundle();
ex.putSerializable(Constants.Extra.VACANCY, vacancies);
ex.putString("token", token);
ex.putString("cosa", cosa.getText().toString());

ex.putInt("dist", searchDistance.getProgress());
ex.putString("dove", dove.getText().toString());
if (ret.getSearchLocation() != null) {
ex.putParcelable("userLoc", ret.getSearchLocation());
}
ex.putInt("totRows", ret.getTotFound());

myIntent.putExtras(ex);
activity.startActivity(myIntent);

ArrayList 的空缺很小,大约 8 个 POJO,在 Thread 中加载,然后通过 Intent 的 extra 传递给新的 Activity。如果我将它增加到大约 90k,应用程序会无限期地循环,需要重新启动,这真的很烦人。 还有其他人遇到过这种情况吗?

最佳答案

限制应该是 1MB,但它因设备而异,从略小于 512KB 到几乎完整的 1MB 不等。除此之外,您还有另一个问题。你把一个 ArrayList 作为一个额外的东西,这很好,因为 ArrayList 实现了 Serializable。但是如果你认为 android 会将这个列表序列化为 byte[] 并传输那你就错了。它将自己序列化每个项目并传输它。这比听起来效率低得多。您应该将 ArrayList 包装在一个实现 Serializable 的包装器对象中,这将产生巨大的不同。看这个blog post (我的)了解更多详情。

关于android - 启动新 Activity 时发生 TransactionTooLargeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14897770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com