2013-02-15 44 views
5

Tôi nghĩ giới hạn phụ của Intent là 1MB, như được báo cáo trên docs. Dù sao, tôi mất một ngày đuổi khủng khiếp TransactionTooLargeException này:TransactionTooLargeException khi bắt đầu Hoạt động mới

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) 

điều xấu là startActivity thất bại, nhưng ActivityManager tục khởi động lại nó hơn và hơn, đẻ trứng quá trình vô hạn. Điều này dường như được xác nhận trên this bài đăng trên blog, trong đó tác giả chỉ ra một giới hạn là 'giới hạn' của 86389 ký tự. mảnh có liên quan của tôi mã khá đơn giản:

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

Các tuyển dụng ArrayList là rất nhỏ, khoảng 8 POJO, mà được nạp trong một chủ đề và sau đó chuyển đến một hoạt động mới qua Intent thêm của. Nếu tôi tăng nó lên khoảng 90k, vòng lặp ứng dụng vô thời hạn yêu cầu khởi động lại, một sự phiền toái thực sự. Bất kỳ ai khác đã trải nghiệm điều này?

+0

có phương thức 'putParcelableArrayList()'. tôi đã không nhìn vào nguồn nhưng có lẽ nó hiệu quả hơn việc sử dụng 'putSerializable()' chung. – paul

Trả lời

1

Giới hạn được cho là 1MB nhưng thay đổi theo thiết bị từ ít hơn 512KB đến gần 1MB đầy đủ. Bên cạnh đó bạn có một vấn đề khác ở đây. Bạn đang đặt một ArrayList như là một phụ mà là tốt kể từ khi ArrayList thực hiện Serializable. Nhưng nếu bạn nghĩ rằng android sẽ sắp xếp lại danh sách này thành byte [] và truyền tải rằng bạn đã sai. Nó sẽ tự tuần tự hóa từng mục và chuyển nó. Và điều đó không hiệu quả hơn nhiều so với âm thanh. Bạn nên bọc ArrayList trong một đối tượng bao bọc thực hiện Serializable và điều đó sẽ tạo ra một sự khác biệt rất lớn. Xem này blog post (mỏ) để biết thêm chi tiết.

1

Tôi đã có cùng một vấn đề, giải quyết nó bằng cách làm một singelton Hashtable là tôi lưu chuỗi "dài" của tôi, và tôi chỉ đưa ra chìa khóa trong mục đích.

Các vấn đề liên quan