ProgressDialog 의 hide()와 dismiss()방법

7044 단어 잘못된 총화
Progressdialog 를 네트워크 로 데 이 터 를 불 러 오 라 는 요청 과정 에서 데이터 로드 가 완료 되면 필 자 는 자 연 스 럽 게 Progressdialog 를 hide()방법 으로 호출 했 습 니 다.현재 activity 가 종료 되 었 을 때 문제 가 발생 했 습 니 다android.view.WindowLeaked: Activity com.xxx.xxx.hangup.ProgressDialogActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{dd0bacf G.E...... R.....I. 0,0-684,0} that was originally added here이 문 제 는 현재 dialog 에 의존 하 는 activity 가 소각 되 었 고 dialog 는 여전히 존재 하 며 소각 되 지 않 았 습 니 다.이것 은 정말 평소에 api 를 사용 할 때 별로 주의 하지 않 은 결과 입 니 다.hide()방법 을 호출 하 는 것 은 dialog 의 숨 김 을 실현 할 수 있 지만 dialog 대상 은 소각 되 지 않 았 습 니 다.다음은 간단 한 테스트 입 니 다.
public class ProgressDialogActivity extends Activity {
    private ProgressDialog pd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //    ProgressDialog,   show()  
        pd = new ProgressDialog(this);
        pd.setMessage(" activity showdialog ,    activity  ");
        pd.setTitle("dialog    ");
        pd.show();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //   onResume()   dialog hide()  ,        back ,     log
        /**
         * 
        01-01 02:37:26.845: E/MultiWindowProxy(25617): getServiceInstance failed!
        01-01 02:37:30.569: E/WindowManager(25617): android.view.WindowLeaked: Activity com.xxx.xxx.hangup.ProgressDialogActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{dd0bacf G.E...... R.....I. 0,0-684,0} that was originally added here
        01-01 02:37:30.569: E/WindowManager(25617):     at android.view.ViewRootImpl.(ViewRootImpl.java:460)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:306)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.Dialog.show(Dialog.java:326)
        01-01 02:37:30.569: E/WindowManager(25617):     at com.xxx.xxxx.hangup.ProgressDialogActivity.onCreate(ProgressDialogActivity.java:25)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.Activity.performCreate(Activity.java:6301)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2523)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2658)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.-wrap11(ActivityThread.java)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1492)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.os.Handler.dispatchMessage(Handler.java:111)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.os.Looper.loop(Looper.java:207)
        01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.main(ActivityThread.java:5741)
        01-01 02:37:30.569: E/WindowManager(25617):     at java.lang.reflect.Method.invoke(Native Method)
        01-01 02:37:30.569: E/WindowManager(25617):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
        01-01 02:37:30.569: E/WindowManager(25617):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:685)
         */
        if(pd != null){
            pd.hide();
        }   
    }
}

위의 주석 은 이상 로그 정보 입 니 다.
다음은 hide()와 dismiss()방법의 구체 적 인 실현 을 살 펴 보 겠 습 니 다.hide()소스 코드 는 다음 과 같 습 니 다/**
* Hide the dialog, but do not dismiss it.
*/
public void hide() {
if (mDecor != null) {
mDecor.setVisibility(View.GONE);
}
}
dialog 는 view 보기 임 을 명확 하 게 보 았 으 며,hide()구현 에 서 는 view 를 gone 으로 설정 할 뿐 제거 하지 않 았 습 니 다.dialog 의 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}.
     */
    @Override
    public void dismiss() {
        if (Looper.myLooper() == mHandler.getLooper()) {
            dismissDialog();
        } else {
            mHandler.post(mDismissAction);
        }
    }

dismissDialog 의 실현 을 살 펴 보 겠 습 니 다.
 void dismissDialog() {
        if (mDecor == null || !mShowing) {
            return;
        }

        if (mWindow.isDestroyed()) {
            Log.e(TAG, "Tried to dismissDialog() but the Dialog's window was already destroyed!");
            return;
        }

        try {
            mWindowManager.removeViewImmediate(mDecor);
        } finally {
            if (mActionMode != null) {
                mActionMode.finish();
            }
            mDecor = null;
            mWindow.closeAllPanels();
            onStop();
            mShowing = false;

            sendDismissMessage();
        }
    }

mWindow Manager.removeView Immediate(mDecor)의 코드 를 보 았 습 니 다.이로써 dialog 의 view 가 진정 으로 제거 되 었 습 니 다.동료 들 이 나 와 같은 로 우 실 수 를 하지 않 았 으 면 좋 겠 어...

좋은 웹페이지 즐겨찾기