본문 바로가기

개발/ETC

android.view.WindowLeaked: Activity .MainActivity has leaked window ... Exception 처리




열심히 안드로이드 공부하면서 어플 제작중에


android.view.WindowLeaked: Activity 도메인.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$

DecorView{1cae0442 V.E..... R....... 0,0-1025,408} that was originally added here

이런 에러가 로그캣에 떳다.
해석해도 모르겠다 이건.


MainActivity에 있는 폰에 뒤로버튼 눌렀을 때(onBackPressed() 오버라이딩) 
AlertDialog 써서 "앱을 완전히 종료하시겠습니까?" "예" "아니오" 띄우려는 부분이었다.
@Override
public void onBackPressed() {
Toast.makeText(getApplicationContext(), "뒤로버튼 눌림!!", Toast.LENGTH_SHORT).show();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("앱을 완전히 종료하시겠습니까?");
builder.setPositiveButton("", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// process 전체 종료!
finish();
//android.os.Process.killProcess(android.os.Process.myPid());
}
});
builder.setNegativeButton("아니요", null);
builder.show();
그래서 열심히 구글에 찾아보니,
대충 문제는 Dialog가 떴을 때 앱이 종료된다거나, 
dismiss()없이 바로 액티비티를 종료시켜서 그러하단다.



아 내가 NegativeButton 부분에 아무것도 안줬구나, 하고 수정했다.

builder.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});

 

이것도 문제였는데 이것만이 문제가 아니었음. 또 같은 Exception이 뜸.


저 출처 페이지에서 Dialog를 다 죽이고 액티비티를 죽여보라고 하길래,

"예" 클릭리스너 부분을 수정했다.

builder.setPositiveButton("", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// process 전체 종료!
onPause();
dialogInterface.dismiss();
finish();
//android.os.Process.killProcess(android.os.Process.myPid());
}
onDestroy(), onPause(), dismiss() 를 계속 섞어가면서 써봤는데,
틀렸다.
너~무 기초가 없어서 닥치는데로 하고만 있었다.

음 .... 내 생각으로....... 해석해보자면
Pause()  Builder(AlertDialog)를 중지시키고
dialogInterface 이 리스너의 인터페이스를 .dismiss()로 완전 묵살시키고
finish() 그러고 끝낸다.

그러니 잘 돌아간다.


고친코드:

@Override
public void onBackPressed() {
Toast.makeText(getApplicationContext(), "뒤로버튼 눌림!!", Toast.LENGTH_SHORT).show();

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("앱을 완전히 종료하시겠습니까?");
builder.setPositiveButton("", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// process 전체 종료!
onPause();
dialogInterface.dismiss();
finish();
//android.os.Process.killProcess(android.os.Process.myPid());
}
});
builder.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
builder.show();
}


반응형