6

docsで報告されているように、インテントのサイズの追加制限は1MBだと思いました。とにかく、私はこのひどいものを追いかけて 1 日を失いました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 で、Thread にロードされ、Intent の extra を介して新しいアクティビティに渡されます。約 90k に増やすと、アプリが無期限にループし、再起動が必要になり、本当に面倒です。他の誰かがこれを経験しましたか?

4

2 に答える 2

2

制限は 1MB であると想定されていますが、512KB 弱からほぼ 1MB までデバイスによって異なります。それとは別に、ここで別の問題があります。ArrayList は Serializable を実装しているため、ArrayList を余分なものとして配置しています。しかし、Android がこのリストを byte[] にシリアライズして転送すると思うなら、それは間違いです。すべてのアイテムを独自にシリアル化し、それを転送します。そして、それは思ったよりもはるかに非効率的です。Serializable を実装するラッパー オブジェクトで ArrayList をラップする必要があります。これにより、大きな違いが生まれます。詳細については、このブログ投稿(私のもの) を参照してください。

于 2015-03-25T01:38:24.690 に答える