2013-02-15 34 views
5

शुरू करते समय TransactionTooLargeException मैंने सोचा कि आकार में इरादा की अतिरिक्त सीमा 1 एमबी थी, जैसा कि docs पर बताया गया था। वैसे भी, मैं पीछा करते हुए इस भयानक 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 ब्लॉग पोस्ट पर पुष्टि की गई है, जहां लेखक 8638 9 वर्णों की 'सीमा' इंगित करता है। कोड का मेरा प्रासंगिक टुकड़ा काफी सरल है:

    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, कि एक थ्रेड में लोड हो जाता है और उसके बाद आशय के अतिरिक्त के माध्यम से एक नई गतिविधि के लिए पारित कर दिया। अगर मैं इसे लगभग 9 0k तक बढ़ाता हूं, तो ऐप अनिश्चित काल तक रीबूट की आवश्यकता होती है, एक वास्तविक परेशानी। किसी और ने इस का अनुभव किया?

+0

एक विधि 'putParcelableArrayList() 'है। मैंने स्रोत को नहीं देखा है, लेकिन सामान्य 'putSerializable() 'का उपयोग करने से यह अधिक कुशल हो सकता है। – paul

उत्तर

1

सीमा 1 एमबी होने वाली है, लेकिन यह डिवाइस द्वारा 512 केबी से कम से कम एक पूर्ण 1 एमबी तक भिन्न होती है। इसके अलावा आपको यहां एक और समस्या है। आप एक अतिरिक्त के रूप में एक ArrayList डाल रहे हैं जो ठीक है क्योंकि ArrayList Serializable लागू करता है। लेकिन अगर आपको लगता है कि एंड्रॉइड इस सूची को बाइट [] में क्रमबद्ध करेगा और हस्तांतरित करेगा कि आप गलत हैं। यह प्रत्येक आइटम को अपने आप क्रमबद्ध करेगा और उसे स्थानांतरित करेगा। और यह लगता है की तुलना में यह अधिक अक्षम है। आपको एरियालिस्ट को एक रैपर ऑब्जेक्ट में सेरिअलाइज़ेबल लागू करने के लिए लपेटना चाहिए और इससे बड़ा अंतर आएगा। अधिक जानकारी के लिए यह blog post (मेरा) देखें।

1

मुझे एक ही समस्या थी, इसे सिंगलटन हैशटेबल बनाकर हल किया गया था, मैं अपनी "लंबी" स्ट्रिंग को बचाता था, और मैं केवल इरादे में कुंजी देता हूं।