본문 바로가기
개발/Android Error

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

by JhDroid 2021. 1. 11.
728x90

에러 메시지

WindowManager: android.view.WindowLeaked
: Activity has leaked window DecorView@ac12e84[] that was originally added here

 

문제

  • 다이얼로그를 띄운 후 액티비티가 종료되기 전까지 dismiss()를 호출해주지 않을 때 발생
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

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

        Handler(Looper.getMainLooper()).postDelayed({
            finish()
        }, 2000)
    }
}
  • Dialog를 띄운 후 2초 뒤에 finish()를 호출하는 예제 코드입니다.
    • 2초 뒤 액티비티가 종료되면 아래와 같은 에러 로그와 함께 종료됩니다.
2021-01-11 12:05:53.076 29314-29314/com.jhdroid.blog.sample E/WindowManager: android.view.WindowLeaked: Activity com.jhdroid.blog.sample.MainActivity has leaked window DecorView@e21ada8[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:16)
        ....
  • 평소 개발할 때 Logcat을 확인을 하지 않으면 해당 에러가 발생했는지 확인하기 어렵습니다.

 

해결

  • 해당 에러는 액티비티가 종료되기 전 다이얼로그의 dismiss()함수를 호출하면 해결됩니다.
  • 가장 쉽게 처리하는 방법은 액티비티의 onDestroy()에서 해당 액티비티에서 사용한 다이얼로그의 dismiss()를 호출하면 됩니다.
    • 단, 다이얼로그의 상태(띄워져 있는 상태, 닫힌 상태)를 확인 후 띄워져 있는 상태인 경우에만 dismiss()를 호출해야 합니다.
    • 다이얼로그의 상태는 isShowing()함수로 확인이 가능합니다.
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().postDelayed({
            finish()
        }, 2000)
    }

    override fun onDestroy() {
        super.onDestroy()

        //다이얼로그가 띄워져 있는 상태(showing)인 경우 dismiss() 호출
        if (alertDialog != null && alertDialog!!.isShowing) {
            alertDialog!!.dismiss()
        }
    }
}
  • onDestroy()에서 다이얼로그의 dismiss() 함수를 호출하면 해당 에러가 발생하지 않는 것을 확인할 수 있습니다.
  • 해당 에러와 비슷한 에러로는 lllegalArgumentException: View=DecorView not attached to window manager 에러가 있습니다, 이 에러는 다음 글을 참고해주세요.
 

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

에러 메시지 java.lang.IllegalArgumentException : View=DecorView@647f13a[MainActivity] not attached to window manager 문제 액티비티가 종료된 후 dismiss() 호출하는 경우 발생 class MainActivity : AppCo..

jhdroid.tistory.com

 

 

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

 

 

728x90