Android

[스레드 관련 오류 처리]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);

 

[참고]
https://stackoverflow.com/questions/37689903/animators-may-only-be-run-on-looper-threads-android/40508143

 

Leave a Reply

error: Content is protected !!