본문 바로가기
개발/Android Error

[Error] IllegalArgumentException: View=DecorView not attached to window manager

by JhDroid 2021. 1. 11.
728x90

에러 메시지

 java.lang.IllegalArgumentException
 : View=DecorView@647f13a[MainActivity] not attached to window manager

 

문제

  • 액티비티가 종료된 후 dismiss() 호출하는 경우 발생
class MainActivity : AppCompatActivity() {

    private var alertDialog: AlertDialog? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        alertDialog = AlertDialog.Builder(this)
            .setTitle("JhDroid")
            .setMessage("dismiss()는 중요하다")
            .show()

        Handler(Looper.getMainLooper()).postDelayed({
            if (alertDialog != null && alertDialog!!.isShowing) {
                alertDialog!!.dismiss()
            }
        }, 3000)

        finish()
    }
}
  • 다이얼로그를 띄운 후 3초 뒤에 종료하지만 그 전에 액티비티를 먼저 finish()하는 예제코드입니다.
    • 예제 코드를 실행하면 아래와 같은 에러 로그를 확인할 수 있습니다.
2021-01-11 12:38:26.804 31465-31465/com.jhdroid.blog.sample E/WindowManager: android.view.WindowLeaked: Activity com.jhdroid.blog.sample.MainActivity has leaked window DecorView@647f13a[MainActivity] that was originally added here
        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:597)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
        at android.app.Dialog.show(Dialog.java:342)
        at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1009)
        at com.jhdroid.blog.sample.MainActivity.onCreate(MainActivity.kt:22)
        ...
        ...
2021-01-11 12:38:28.975 31465-31465/com.jhdroid.blog.sample E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.jhdroid.blog.sample, PID: 31465
    java.lang.IllegalArgumentException: View=DecorView@647f13a[MainActivity] not attached to window manager
        at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:517)
        at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:426)
        at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:126)
        at android.app.Dialog.dismissDialog(Dialog.java:389)
        at android.app.Dialog.dismiss(Dialog.java:371)
        at androidx.appcompat.app.AppCompatDialog.dismiss(AppCompatDialog.java:140)
        at com.jhdroid.blog.sample.MainActivity$onCreate$1.run(MainActivity.kt:26)
        ...
		...
  • 먼저 액티비티를 종료하면서 다이얼로그를 dismiss()해주지 않아 발생하는 WindowLeaked 에러 로그가 나온 후 IllegalArgumentException: not attached to window manager 예외가 발생한 것을 확인 가능합니다.

 

해결

 

[Android] WindowLeaked : Activity has leaked window DecorView that was originally added here

에러 메시지 WindowManager: android.view.WindowLeaked : Activity has leaked window DecorView@ac12e84[] that was originally added here 문제 다이얼로그를 띄운 후 액티비티가 종료되기 전까지 dismiss()를..

jhdroid.tistory.com

  • 액티비티의 onDestory()에서 다이얼로그의 dismiss()함수를 호출하면 발생하지 않습니다.
override fun onDestroy() {
    super.onDestroy()
    if (alertDialog != null && alertDialog!!.isShowing) {
        alertDialog!!.dismiss()
    }
}

 

  • 만약 onDestory()에서 dismiss()를 호출하고 있지만 에러가 발생한다면 dismiss() 호출 전 조건문에 액티비티의 종료 여부를 확인하는 코드를 추가하면 됩니다.
    • 액티비티의 종료 여부는 isFinishing() 함수로 확인 가능합니다.
    • isFinishing() == false : 액티비티가 종료되지 않음
//액티비티의 isFinishing() 함수로 액티비티의 종료 여부를 확인한 후 dismiss() 호출
if (alertDialog != null && !isFinishing) {
    alertDialog!!.dismiss()
}

 

 

* 글에 틀린 부분이 있으면 댓글 부탁드립니다 :D

 

728x90