isFinishing()
🕒 읽는 데 0분 예상forest_articles
forest_날짜
forest_분류
문서
isFinishing() 메소드는 Activity 클래스의 메소드로, 현재 액티비티가 종료 중인지 여부를 boolean 값으로 반환한다. 이 메소드는 다음과 같은 특징을 가진다:
- 액티비티가 finish() 메소드를 호출하여 종료 프로세스를 시작했다면 true를 반환한다.
- 액티비티가 아직 활성 상태이거나 종료 프로세스가 시작되지 않았다면 false를 반환한다.
- 시스템에 의해 액티비티가 종료되는 경우에도 true를 반환할 수 있다.
해결할 수 있는 문제
원인
WindowManager$BadTokenException
은 주로 다음과 같은 상황에서 발생한다:- 액티비티가 백그라운드로 전환되거나 종료되는 과정에서 비동기 작업의 결과로 다이얼로그를 표시하려고 할 때이다.
- 액티비티의 생명주기와 맞지 않는 시점에 UI 요소를 업데이트하려고 할 때이다.
- 프래그먼트나 다른 컴포넌트에서 잘못된 컨텍스트를 사용하여 다이얼로그를 표시하려고 할 때이다.
이러한 상황들은 모두 유효하지 않은 윈도우 토큰을 사용하여 UI 작업을 시도하기 때문에 발생한다.
해결 방법
이 문제를 해결하기 위해 다이얼로그나 토스트를 표시하기 전에 isFinishing() 메소드를 사용하여 액티비티의 상태를 확인할 수 있다.
fun showDialog() { if (!isFinishing) { AlertDialog.Builder(this) .setTitle("알림") .setMessage("작업이 완료되었습니다.") .setPositiveButton("확인") { dialog, _ -> dialog.dismiss() } .show() } }
위 코드는 다이얼로그를 표시하기 전에 액티비티가 종료 중이 아닌지 여부를 체크하고, 다이얼로그를 표시하므로 WindowManager$BadTokenException 오류를 방지할 수 있다.