启动新活动时出现TransactionTooLargeException异常

6

我曾认为Intent的额外数据大小限制为1MB,这也是在文档中所报道的。不过,无论如何,我花了一整天时间来追踪这个可怕的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一遍又一遍地重新启动它,生成无限进程。这似乎在博客文章中得到了确认,作者指出“限制”为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 vacancies非常小,大约只有8个POJO,它会在一个线程中加载,然后通过Intent的extra传递到新的activity中。如果我把它增加到大约90k,应用程序就会无限循环,需要重新启动,这真的很烦人。还有其他人遇到过这种情况吗


жңүдёҖдёӘж–№жі•putParcelableArrayList()гҖӮжҲ‘иҝҳжІЎжңүжҹҘзңӢжәҗд»Јз ҒпјҢдҪҶд№ҹи®ёе®ғжҜ”дҪҝз”ЁйҖҡз”Ёзҡ„putSerializable()жӣҙй«ҳж•ҲгҖӮ - paul
2个回答

3

限制应该是1MB,但根据设备的不同,它的大小从略小于512KB到接近1MB。除此之外,你还有另一个问题。你将一个ArrayList作为额外内容放入其中,这很好,因为ArrayList实现了Serializable。但是,如果你认为Android会将这个列表序列化为byte[]并传输它,那就错了。它会单独地序列化每个项目并传输它们。而且这比听起来要低效得多。你应该将ArrayList包装在一个实现Serializable的包装对象中,这将产生巨大的影响。请参阅这篇博客文章(我的)以获取更多详细信息。


1
我曾遇到同样的问题,通过创建一个单例Hashtable来保存我的“长”字符串并仅在意图中提供键来解决它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接