2013-02-15 5 views
5

Je pensais que la limite supplémentaire de l'intention était de 1 Mo, comme indiqué sur docs. Quoi qu'il en soit, j'ai perdu une jours chasser cette terrible TransactionTooLargeException:TransactionTooLargeException lors du démarrage d'une nouvelle activité

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) 

la chose est mauvaise qui ne startActivity, mais ActivityManager ne cesse de redémarrer encore et, fraie processus infinis. Cela semble être confirmé sur this blog, où l'auteur indique une «limite» de 86389 caractères . Ma pièce pertinente de code est assez simple:

    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); 

Les postes vacants ArrayList est très faible, environ 8 POJO, qui est chargé dans un fil, puis passé à une nouvelle activité par EXTRAS intention. Si je l'augmente à environ 90k, l'application boucle indéfiniment nécessitant un redémarrage, un réel ennui. Quelqu'un d'autre a-t-il expérimenté ce?

+0

il existe une méthode 'putParcelableArrayList()'. je n'ai pas regardé la source mais peut-être est-ce plus efficace que d'utiliser le général 'putSerializable()'. – paul

Répondre

1

La limite est supposée être de 1 Mo mais varie d'un peu moins de 512 Ko à presque 1 Mo. En dehors de cela, vous avez un autre problème ici. Vous mettez un ArrayList en extra, ce qui est bien puisque ArrayList implémente Serializable. Mais si vous pensez que Android va sérialiser cette liste à byte [] et transférer que vous avez tort. Il sérialisera chaque article et le transférera. Et c'est beaucoup plus inefficace que ça en al'air. Vous devez placer ArrayList dans un objet wrapper implémentant Serializable et cela fera une énorme différence. Voir ce blog post (mine) pour plus de détails.

1

J'ai eu le même problème, je l'ai résolu en faisant un singelton Hashtable si j'avais sauvé ma "longue" corde, et je n'ai donné que la clé dans l'intention.

Questions connexes