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 예외가 발생한 것을 확인 가능합니다.
해결
- 해당 에러는 이전에 작성한 글과 해결 방법이 동일합니다.
- 액티비티의 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