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 에러가 있습니다, 이 에러는 다음 글을 참고해주세요.
* 글에 틀린 부분이 있으면 댓글 부탁드립니다 :D
728x90