[스레드 관련 오류 처리]Fatal Exception: android.util.AndroidRuntimeException: Animators may only be run on Looper threads
[파이어베이스 크래시틱스 오류보고 내용]
애니메이션 효과에 대한 오류가 보고 되었다.
Fatal Exception: android.util.AndroidRuntimeException: Animators may only be run on Looper threads
at android.animation.ValueAnimator.start(ValueAnimator.java:1044)
at android.animation.ValueAnimator.start(ValueAnimator.java:1098)
at android.animation.ObjectAnimator.start(ObjectAnimator.java:852)
at android.widget.Switch.animateThumbToCheckedState(Switch.java:1245)
at android.widget.Switch.setChecked(Switch.java:1291)
at com.test.TestActivity$16.run(TestActivity.java:630)
at java.util.TimerThread.mainLoop(TimerThread.java:562)
at java.util.TimerThread.run(TimerThread.java:512)
모든 폰에서 발생하는 것은 아니다. 오류가 발생한 휴대폰은 삼성 갤럭시 A30이며, 안드로이드 10이 설치된 휴대폰이다.어쨌든, 오류가 발생되었으니, 처리는 해야한다. 문제는 오류가 발생한 위치인데… 스위치 위젯의 setChecked()메소드를 호출 했을 때 발생했다. TimerTask()를 사용하였고, 그 안에서 UI에 대한 처리를 하여 발생하였다.
[에러가 발생된 코드]
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(requestCode == 999) {
if(switch1!=null) {
Timer tm = new Timer();
tm.schedule(new TimerTask() {
@Override
public void run() {
if(getCurrentWIFI()) switch1.setChecked(false);
else switch1.setChecked(true);
}
}, 500);
}
}
}
[해결 방법]
TimerTask()메소드 대신, Hander()를 사용해서 처리해주면 된다. UI처리에 대한 딜레이를 주기 위해 TimerTask를 사용하였는데, 이부분이 문제가 되었다. Handler 클래스의 PostDelayed()메소드가 있었음을 까먹고 있었다.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if(getCurrentWIFI()) switch1.setChecked(false);
else switch1.setChecked(true);
}
}, 500);