Android 启动新活动时出现TransactionTooLargeException
我认为Intent的额外大小限制是1MB,如上所述。无论如何,我在追逐这个可怕的Android 启动新活动时出现TransactionTooLargeException,android,android-intent,binding,Android,Android Intent,Binding,我认为Intent的额外大小限制是1MB,如上所述。无论如何,我在追逐这个可怕的TransactionTooLargeException: E/JavaBinder(368): !!! FAILED BINDER TRANSACTION !!! Exception when starting activity android/com.android.internal.app.ChooserActivity android.os.TransactionTooLargeException at
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空缺非常小,大约8个POJO,它被加载到一个线程中,然后通过Intent的extra传递给一个新活动。如果我将其增加到90k左右,应用程序将无限期地循环,需要重新启动,这真是一个麻烦还有其他人遇到过这个问题吗?我也遇到过同样的问题,通过在哈希表上创建一个Singleton来解决它,如果我保存我的“长”字符串,我只给出意图中的键。限制应该是1MB,但它因设备而异,从略小于512KB到几乎完全1MB。除此之外,你还有一个问题。您将ArrayList作为一个额外列表,这很好,因为ArrayList实现了可序列化。但如果你认为android会将这个列表序列化为byte[]并传递你错了。它将自己序列化每个项并传输该项。这比听起来效率要低得多。您应该将ArrayList封装在实现Serializable的包装器对象中,这将产生巨大的差异。有关更多详细信息,请参见此(我的)。有一个方法
putParcelableArrayList()
。我没有看过源代码,但它可能比使用常规的putSerializable()
更有效。