안드로이드(Android) Dialog의 cancel()과 dismiss()의 차이

안드로이드(Android)에서 다이얼로그(Dialog)는 앱이 자주 사용하는 UI 컴포넌트이다. 다이얼로그를 보여주는 데는 show() 세드를 사용하고, 종료하는데는 cancel(), dismiss() 메서드를 사용할 수 있다. 종료하는 이 두 메서드에 대해서 API 문서에서는 아래와 같이 설명하고 있다. UI 경험이 별로 없다보니 잘 감이 안 온다. 화면에서 다이얼로그가 종료되는 동작은 같기에 차이가 없어 보인다.

종료하는데 사용하는 두 메서드의 API 문서를 살펴보면 다음과 같다.

void cancel()

Cancel the dialog.
void dismiss()

Dismiss this dialog, removing it from the screen.

이 두 메서드의 차이에 대해서 살펴보자. API 문서만으로 차이점을 알기가 쉽지 않으니, 다이얼로그 API 소스에서 차이를 확인해보자.

1. cancel() 메서드 소스

    /**
     * Cancel the dialog.  This is essentially the same as calling {@link #dismiss()}, but it will
     * also call your {@link DialogInterface.OnCancelListener} (if registered).
     */
    public void cancel() {
        if (!mCanceled && mCancelMessage != null) {
            mCanceled = true;
            // Obtain a new message so this dialog can be re-used
            Message.obtain(mCancelMessage).sendToTarget();
        }
        dismiss();
    }

위 canel() 메서드는 다음의 단계를 거치게 된다. 그리고 이 메서드는 OnCancelListener로 등록한 객체가 있으면 호출해 준다.

  • mCancelMessage가 있으면 메시지를 전달한다.
  • dismiss()를 호출한다.

2. dismiss() 메서드

 
    /**
     * Dismiss this dialog, removing it from the screen. This method can be
     * invoked safely from any thread.  Note that you should not override this
     * method to do cleanup when the dialog is dismissed, instead implement
     * that in {@link #onStop}.
     */
    public void dismiss() {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(mDismissAction);
        } else {
            mHandler.removeCallbacks(mDismissAction);
            mDismissAction.run();
        }
    }

위 dismiss() 메서드는 화면에서 다이얼로그를 종료하는 역할을 하고 스레드 세이프 하다. 스레드 세이프 하다는 것으로 UI 스레드만이 다이얼로그를 종료시킨다는 것도 알 수 있다. 다이얼로그는 mDismissAction.run() 메서드가 종료시킨다. 이 메서드는 dismissDialog() 메서드를 호출하고, 이 메서드에서는 윈도 매니저를 사용해서 다이얼로그를 윈도에서 제거한다.

그리고 다이얼로그가 화면에 보이는 상황에서 백 키를 누르면 아래의 소스와 같이 동작한다. 즉 cancel() 메서드를 호출해서 다이얼로그를 종료시킨다. 따라서 백키의 이벤트로 다이얼로그가 종료하는 상황은 DialogInterface.OnCancelListener 인터페이스를 구현하면 되겠다.

    /**
     * Called when the dialog has detected the user's press of the back
     * key.  The default implementation simply cancels the dialog (only if
     * it is cancelable), but you can override this to do whatever you want.
     */
    public void onBackPressed() {
        if (mCancelable) {
            cancel();
        }
    }

위에서 살펴본 cancel()과 dismiss()와 같이 API 문서를 봐도 차이점이 잘 이해가 되지 않는 경우에는 API 소스를 보면서 확인하는게 매우 도움이 된다.

안드로이드(Android) Dialog의 cancel()과 dismiss()의 차이”에 대한 2개의 생각

  1. 초코아이스티

    으어
    몇일을 dismiss 때문에 뒤적였는데..
    한방에 해결 되었네요 ㅠ;;
    감사합니다
    즐거운 하루 되세요 ^^

    응답
    1. mcsong

      ㅎㅎ 도움이 되서 좋네요.. ^^
      가끔 이렇게 주석만 봐서는 명확한 상태를 잘 모를때는 소스가 확실히 도움이 되네요.. 님도 즐거운 안드로메다 개발 하세요.. ^^

      응답

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.