9

Tôi vừa nâng cấp dự án của mình lên API 23 và tôi gặp lỗi trên mã luôn hoạt động trước đó. Tai nạn xảy ra khi tôi gọi dialog.dismiss() trong trình nghe Spinner bên dưới. Nó không sụp đổ nếu tôi không gọi dismiss trong khu vực này.DeadObjectException khi loại bỏ Hộp thoại trong API 23

void showWeekViewOptionsDialog() { 
    AlertDialog.Builder b = new AlertDialog.Builder(getActivity()); 
    final View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_weekview_options, null); 

    final MaterialSpinnerCallsSameItemSelected spinner = (MaterialSpinnerCallsSameItemSelected) view.findViewById(R.id.spinner_weekview_days); 
    ArrayAdapter<Integer> dayListAdapter; 

    ArrayList<Integer> dayList = new ArrayList<Integer>(); 
    dayList.add(2); 
    dayList.add(3); 

    dayListAdapter = new ArrayAdapter<Integer>(getActivity(), R.layout.my_spinner_item, dayList); 
    dayListAdapter.setDropDownViewResource(R.layout.my_spinner_dropdown_item); 
    spinner.setAdapter(dayListAdapter); 

    spinner.setSelection(dayListAdapter.getPosition(mWeekViewType)); 

    b.setView(view); 
    final AlertDialog dialog = b.create(); 
    spinner.setOnItemSelectedEvenIfUnchangedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
      dialog.dismiss(); // crashes here! 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> adapterView) { 
     } 
    }); 
    dialog.show(); 
} 

Dưới đây là đầu ra logcat. Tôi không biết ý nghĩa của nó là gì bởi Hàng đợi bộ đệm bị bỏ rơi hoặc DeadObjectException. Từ nghiên cứu của tôi, có vẻ như một vật thể đang được tham chiếu từ một quá trình chết? Tôi không hiểu tại sao điều đó lại xảy ra hoặc tại sao điều này chỉ xảy ra ở Marshmallow. Bất kỳ trợ giúp được đánh giá cao. Cảm ơn!

01-06 17:53:45.791 4436-4485/com.NSouthDomain.NSouthApplication E/Surface: getSlotFromBufferLocked: unknown buffer: 0x9c359200 
01-06 17:53:46.066 1278-1303/system_process W/WindowManager: Force-removing child win Window{df5d861 u0 PopupWindow:ac39394} from container Window{d72786b u0 com.NSouthDomain.NSouthApplication/com.NSouthDomain.NSouthApplication.Activity_Main} 
01-06 17:53:46.087 941-1963/? E/BufferQueueProducer: [PopupWindow:ac39394] dequeueBuffer: BufferQueue has been abandoned 
01-06 17:53:46.089 941-941/? W/SurfaceFlinger: couldn't log to binary event log: overflow. 
01-06 17:53:46.090 4436-4485/com.NSouthDomain.NSouthApplication E/EGL_emulation: tid 4485: swapBuffers(322): error 0x3003 (EGL_BAD_ALLOC) 
01-06 17:53:46.090 4436-4485/com.NSouthDomain.NSouthApplication A/OpenGLRenderer: Encountered EGL error 12291 EGL_BAD_ALLOC during rendering 
01-06 17:53:46.090 4436-4485/com.NSouthDomain.NSouthApplication A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 4485 (RenderThread) 
01-06 17:53:46.208 949-949/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
01-06 17:53:46.208 949-949/? A/DEBUG: Build fingerprint: 'Android/sdk_google_phone_x86/generic_x86:6.0/MASTER/2497369:userdebug/test-keys' 
01-06 17:53:46.208 949-949/? A/DEBUG: Revision: '0' 
01-06 17:53:46.208 949-949/? A/DEBUG: ABI: 'x86' 
01-06 17:53:46.208 949-949/? A/DEBUG: pid: 4436, tid: 4485, name: RenderThread >>> com.NSouthDomain.NSouthApplication <<< 
01-06 17:53:46.208 949-949/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 
01-06 17:53:46.210 949-949/? A/DEBUG: Abort message: 'Encountered EGL error 12291 EGL_BAD_ALLOC during rendering' 
01-06 17:53:46.211 949-949/? A/DEBUG:  eax 00000000 ebx 00001154 ecx 00001185 edx 00000006 
01-06 17:53:46.211 949-949/? A/DEBUG:  esi a2cbf980 edi 0000000b 
01-06 17:53:46.211 949-949/? A/DEBUG:  xcs 00000073 xds 0000007b xes 0000007b xfs 00000077 xss 0000007b 
01-06 17:53:46.211 949-949/? A/DEBUG:  eip b7304696 ebp 00001185 esp a2cbf150 flags 00200202 
01-06 17:53:46.211 949-949/? A/DEBUG:  #00 pc 00083696 /system/lib/libc.so (tgkill+22) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #01 pc 000815e8 /system/lib/libc.so (pthread_kill+70) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #02 pc 00027205 /system/lib/libc.so (raise+36) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #03 pc 000209e4 /system/lib/libc.so (abort+80) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #04 pc 0000cbc3 /system/lib/libcutils.so (__android_log_assert+128) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #05 pc 00023759 /system/lib/libhwui.so 
01-06 17:53:46.212 949-949/? A/DEBUG:  #06 pc 0001e866 /system/lib/libhwui.so 
01-06 17:53:46.212 949-949/? A/DEBUG:  #07 pc 000216ef /system/lib/libhwui.so 
01-06 17:53:46.212 949-949/? A/DEBUG:  #08 pc 00027137 /system/lib/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+151) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #09 pc 00014aac /system/lib/libutils.so (android::Thread::_threadLoop(void*)+418) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #10 pc 0006bfee /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+98) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #11 pc 000141cf /system/lib/libutils.so (thread_data_t::trampoline(thread_data_t const*)+122) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #12 pc 00080a93 /system/lib/libc.so (__pthread_start(void*)+56) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #13 pc 00021952 /system/lib/libc.so (__start_thread+25) 
01-06 17:53:46.212 949-949/? A/DEBUG:  #14 pc 000170b6 /system/lib/libc.so (__bionic_clone+70) 
01-06 17:53:46.282 949-949/? E/DEBUG: AM write failed: Broken pipe 
01-06 17:53:46.282 1278-1298/system_process I/BootReceiver: Copying /data/tombstones/tombstone_09 to DropBox (SYSTEM_TOMBSTONE) 
01-06 17:53:46.303 1278-8703/system_process W/ActivityManager: Force finishing activity com.NSouthDomain.NSouthApplication/.Activity_Main 
01-06 17:53:46.309 955-955/? I/Zygote: Process 4436 exited due to signal (6) 
01-06 17:53:46.319 1278-1320/system_process W/InputDispatcher: channel 'bbdfcc6 com.NSouthDomain.NSouthApplication/com.NSouthDomain.NSouthApplication.Activity_Main (server)' ~ Consumer closed input channel or an error occurred. events=0x9 
01-06 17:53:46.319 1278-1320/system_process E/InputDispatcher: channel 'bbdfcc6 com.NSouthDomain.NSouthApplication/com.NSouthDomain.NSouthApplication.Activity_Main (server)' ~ Channel is unrecoverably broken and will be disposed! 
01-06 17:53:46.323 1278-1820/system_process D/GraphicsStats: Buffer count: 3 
01-06 17:53:46.391 941-941/? E/EGL_emulation: tid 941: eglCreateSyncKHR(1294): error 0x3004 (EGL_BAD_ATTRIBUTE) 
01-06 17:53:46.437 1278-1820/system_process I/WindowState: WIN DEATH: Window{bbdfcc6 u0 com.NSouthDomain.NSouthApplication/com.NSouthDomain.NSouthApplication.Activity_Main} 
01-06 17:53:46.437 1278-1820/system_process W/InputDispatcher: Attempted to unregister already unregistered input channel 'bbdfcc6 com.NSouthDomain.NSouthApplication/com.NSouthDomain.NSouthApplication.Activity_Main (server)' 
01-06 17:53:46.437 1278-8703/system_process W/ActivityManager: Exception thrown during pause 
                   android.os.DeadObjectException 
                    at android.os.BinderProxy.transactNative(Native Method) 
                    at android.os.BinderProxy.transact(Binder.java:503) 
                    at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:727) 
                    at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:867) 
                    at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2907) 
                    at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2763) 
                    at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2755) 
                    at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:11971) 
                    at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:11867) 
                    at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:12556) 
                    at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:12063) 
                    at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86) 
01-06 17:53:46.441 1278-1290/system_process I/ActivityManager: Process com.NSouthDomain.NSouthApplication (pid 4436) has died 
01-06 17:53:46.549 1278-3883/system_process I/OpenGLRenderer: Initialized EGL, version 1.4 
01-06 17:53:46.584 1595-1904/com.google.android.googlequicksearchbox W/EGL_emulation: eglSurfaceAttrib not implemented 
01-06 17:53:46.584 1595-1904/com.google.android.googlequicksearchbox W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xa21efb80, error=EGL_SUCCESS 
01-06 17:53:46.607 1278-3883/system_process W/EGL_emulation: eglSurfaceAttrib not implemented 
01-06 17:53:46.607 1278-3883/system_process W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9dba5180, error=EGL_SUCCESS 
01-06 17:53:47.139 1595-1904/com.google.android.googlequicksearchbox W/OpenGLRenderer: Incorrectly called buildLayer on View: em, destroying layer... 
01-06 17:53:47.143 1278-1303/system_process W/WindowAnimator: Failed to dispatch window animation state change. 
                   android.os.DeadObjectException 
                    at android.os.BinderProxy.transactNative(Native Method) 
                    at android.os.BinderProxy.transact(Binder.java:503) 
                    at android.view.IWindow$Stub$Proxy.onAnimationStopped(IWindow.java:534) 
                    at com.android.server.wm.WindowAnimator.updateWindowsLocked(WindowAnimator.java:286) 
                    at com.android.server.wm.WindowAnimator.animateLocked(WindowAnimator.java:678) 
                    at com.android.server.wm.WindowAnimator.-wrap0(WindowAnimator.java) 
                    at com.android.server.wm.WindowAnimator$1.doFrame(WindowAnimator.java:123) 
                    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:856) 
                    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                    at android.view.Choreographer.doFrame(Choreographer.java:603) 
                    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:148) 
                    at android.os.HandlerThread.run(HandlerThread.java:61) 
                    at com.android.server.ServiceThread.run(ServiceThread.java:46) 
01-06 17:53:47.172 1278-1293/system_process I/Choreographer: Skipped 32 frames! The application may be doing too much work on its main thread. 
01-06 17:53:47.192 941-941/? W/SurfaceFlinger: couldn't log to binary event log: overflow. 
+0

Hai gợi ý. Thêm hộp kiểm kiểm tra trống và kiểm tra xem hộp thoại có hiển thị trước khi bạn loại bỏ nó hay không. Cũng đăng mã mà bạn có trong onDestroy và onPause/onStop. Dường như hoạt động này của bạn đã bị đóng/hủy trước khi bạn gọi nó. – AAnkit

+0

@AnkitAwasthi, tôi đã kiểm tra và hộp thoại không phải là rỗng khi tôi gọi là 'loại bỏ', cũng không phải là hoạt động. Hộp thoại 'isShowing()' trả về true. Ngoài ra, không có onPause/onStop/onDestroy nào được gọi trong phân đoạn hoạt động hoặc lưu trữ. Hoạt động này không bị đóng/hủy. Suy nghĩ? – NSouth

+1

Điều này thật thú vị, bạn có thể thử dialog.cancel thay vì .dismiss, chỉ để kiểm tra xem điều gì xảy ra. Ngoài ra chỉ cần thêm một dòng đăng nhập trước và sau khi dialog.dismiss để xác nhận nó đang bị rơi trong đó chỉ !! – AAnkit

Trả lời

1

Là cuộc trò chuyện bình thường trong nhận xét, bạn cho biết việc hủy/hủy không làm hỏng ứng dụng, nhưng sau đó là một điều gì đó khác.

log tai nạn của bạn nói >>

Ứng dụng này có thể làm quá nhiều việc vào chủ đề chính của nó.

Kiểm tra mã ứng dụng của bạn và xác nhận rằng bạn không thực hiện bất kỳ tác vụ chạy dài nào trong chuỗi chính.

+0

Không có mã trong ứng dụng của tôi đang chạy sau khi hộp thoại được miễn nhiệm (tôi đã bình luận ra những gì là bình thường chạy). Tôi nghi ngờ rằng điều này có liên quan đến việc cố gắng loại bỏ từ người nghe 'onItemSelected()' của Spinner. – NSouth

+0

Chính xác đó cũng là điều tôi nghi ngờ. – AAnkit

+0

@AAnkit như vậy làm thế nào để làm cho nó ít hoạt động trên chủ đề chính? – rxlky

1

Không phải là câu trả lời đúng, nhưng tôi đã tìm được giải pháp thay thế. Thay vì sa thải khỏi người nghe Spinner, tôi đã thêm một nút. Bây giờ người dùng chọn từ spinner và nhấn "Apply". Đó là một vòi phụ, nhưng ít nhất nó hoạt động. Vì Áp dụng là một trong các nút hộp thoại mặc định, nó tự động loại bỏ hộp thoại và mọi thứ đều ổn.

Nếu có ai biết lý do tại sao việc loại bỏ người nghe Spinner bị hỏng trong Marshmallow, tôi là tất cả các tai.

3

Có đây là lỗi trong M ... Nhưng tôi đã tìm ra giải pháp. Chỉ cần thực hiện một handler postDelayed call với ~ 500 ms deplay

+0

Vì vậy, bạn loại bỏ hộp thoại với độ trễ ~ 500ms? Cái này có hoạt động không? Ai đó có thể xác nhận? – Nifhel

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