2013-02-15 2 views
5

docs에보고 된 의도 한 크기의 의도 한도가 1MB라고 생각했습니다.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 무한 프로세스를 산란, 반복을 계속 다시 시작 : 어쨌든, 나는이 끔찍한 TransactionTooLargeException 쫓는 일일 잃었다. 이것은 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

나는 동일한 문제를 가지고 있는데, 나는 "긴"문자열을 저장 했으므로 singelton Hashtable을 작성하여 해결했다. 나는 의도 한 키만 준다.

관련 문제