Android

[안드로이드 IllegalStateException] Can not be called to deliver a result. finishAffinity 오류 처리하기

테스트할 때는 분명 오류가 없었기에 구글플레이에 업데이트 하였다. 그러나 수 많은 폰들이 존재하기에… 사용자들에게 오류가 발생했고, 파이어베이스 오류보고 관련 이메일이 왔다. 오류가 발생한 휴대폰은 안드로이드9 운영체제를 상요하는 갤럭시 노트8 기기였다. 



오류 내용은 다음과 같다.

Fatal Exception: java.lang.IllegalStateException: Can not be called to deliver a result
       at android.app.Activity.finishAffinity(Activity.java:5765)
       at com.app.test.ExitActivity$1.onClick(ExitActivity.java:55)
       at android.view.View.performClick(View.java:7359)
       at android.widget.TextView.performClick(TextView.java:14230)
       at android.view.View.performClickInternal(View.java:7325)
       at android.view.View.access$3200(View.java:846)
       at android.view.View$PerformClick.run(View.java:27807)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7073)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

[오류 원인]

메인 액티비티에서 다른 액티비티를 호출할 때 결과를 리턴 받도록 설정을 하였다. 그러나 결과를 리턴하지 않고 종료하는 버튼이 있는데, 이 버튼을 눌렀을 때 finishAffinity()메소드를 호출하여 앱을 종료하였을 때 발생되었다.

(MainActivity.class)

Intent intent = new Intent(MainActivity.this, ExitActivity.class);
//현재 프레그먼트 체크 
for (Fragment fragment: getSupportFragmentManager().getFragments()) {
	if (fragment.isVisible()) {
		if(fragment instanceof HomeFragment){
			intent.putExtra("PAGE_TYPE",1);
		}else if(fragment instanceof MyNumberFragment){
			intent.putExtra("PAGE_TYPE",2);
		}
	}
}
startActivityForResult(intent, 24);

(ExitActivity.class)

Button buttonExit =  findViewById(R.id.button_exit);
buttonExit.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		finishAffinity();
	}
});

 

 

[오류 해결 방법]

finishAffinity() 종료 메소드를 호출하기 전에 setResult()메소드를 호출시 취소값을 지정하여 결과 리턴을 취소처리를 해야한다.

setResult(Activity.RESULT_CANCELED);
Button buttonExit =  findViewById(R.id.button_exit);
buttonExit.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
        setResult(Activity.RESULT_CANCELED);
		finishAffinity();
	}
});

 

setResult() 더 알아보기


source : https://developer.android.com/reference/android/app/Activity.html#setResult(int)

 


https://developer.android.com/reference/android/app/Activity#setResult(int,%20android.content.Intent)

Leave a Reply

error: Content is protected !!