2013-02-15 23 views
5

docsで報告されているように、インテントのサイズの余裕が1MBであると思っていました。とにかく、私はこの恐ろしいTransactionTooLargeExceptionを追いかけて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は無限のプロセスを生成、何度もそれを再起動し続けています。これは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、非常に小さいです。私が約90kにそれを上げると、アプリは無期限に再起動する必要があります。本当に迷惑です。 誰でもこの経験があります

+0

メソッド 'putParcelableArrayList()'があります。私はソースを見ていないが、一般的な 'putSerializable()'を使うよりも効率的かもしれない。 – paul

答えて

1

制限は1MBとされていますが、デバイスによって異なりますが、512KB未満からほぼ1MBまでです。それ以外に、ここに別の問題があります。 ArrayListはSerializableを実装しているので、あなたは余分なものとしてArrayListを入れています。しかし、もしあなたがアンドロイドがこのリストをバイト[]にシリアル化し、あなたが間違っていると思うなら。それは、すべてのアイテムをそれぞれシリアル化して転送します。そしてそれはそれがはるかに非効率的です。 Serializableを実装しているラッパーオブジェクトにArrayListをラップすると、大きな違いが生じます。詳細はblog post(私)を参照してください。

1

私は同じ問題を抱えていましたが、シングルトンを作ることで解決しました。「長い」文字列を保存していました。

関連する問題