반응형

개요

 

이번에는 안드로이드 Thread 작업중

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

라는 오류가 발생했습니다.

 

이 오류는 안드로이드 UI는 mainThread가 담당하는데 다른 Thread에서 UI를 계속 호출해서 오류가 났던 것입니다..

ㄷㄷ

무튼 그래서 이 오류는 Handler를 사용해도 되고 mainThread에서 이작업을 하라고 명시해 주어도 되는데

이번에는 mainThread에서 명시해주는 것을 사용해 보겠습니다..

 


안드로이드 카운트다운 Thread 코드

 

private int startTimerTask(final String min) {
        // min = 01:00:00
        stopTimerTask();

        timerTask = new TimerTask() {
            String strminute = min.substring(0,2);
            String strsecond = min.substring(3,5);
            String strmilli = min.substring(6);

            int minute = Integer.parseInt(strminute);
            int seconds = Integer.parseInt(strsecond);
            int millise = Integer.parseInt(strmilli);
            int milliseconds = (minute*6000 + seconds*100+millise);
            
            // 1분에 60000밀리세컨드
            // 1분에 60초
            // 1초에 1000밀리세컨드
            @Override
            public void run() {
                milliseconds--;
                final int seconds = (int) (milliseconds / 100) % 60;
                final int minutes = (int) ((milliseconds / (100 * 60)) % 60);
                final int tmillisecond = ((milliseconds) % 100);

                    txt_timer.post(new Runnable() {
                        @Override
                        public void run() {
                            if (minutes < 10) {
                                txt_timer.setText("0" + minutes + ":" + seconds + ":" + tmillisecond);
                                if (seconds < 10) {
                                    txt_timer.setText("0" + minutes + ":" + "0" + seconds + ":" + tmillisecond);
                                        if(milliseconds<0) {
                                            txt_timer.setText("00:00:00");
                                            stopTimerTask();
                                        }
                                }
                            }
                        }
                    });
            }
        };
        timer.schedule(timerTask, 0, 10);
        return 0;

    }

    private void stopTimerTask() {
        if (timerTask != null) {
            timerTask.cancel();
            timerTask = null;
        }
    }

 

Runnable() 안의 run부분에서 UI작업을 해주면 오류는 해결됩니다..

 


 

반응형

+ Recent posts