본문 바로가기

운동하는 개발자/Android

안드로이드 타이머 중지/시작, 타이머 재시작 / android timer stop and go

728x90

기본적으로 안드로이드에선 timer와 timertask를 만들고 timer가 schedule 함수를 통해 timertask를 주기적으로 호출되게 한다

그런데 이 특정작업을 하는 timertask는 한번 cancle()명령으로 멈출 경우 다시 schedule함수로 시작 할 수 없다

찾아보니 자바에서는 "이 멈추어진 타이머 테스크가 다시 실행 될 일이 없을꺼라 생각하며 다시 실행되야 하는경우는 올바르지 않는 코딩 상황이다" 라고 표현하였다

그런데 원래 타이머는 잠깐 멈췄다 실행하고 다들 하지 않는가...?

여튼 그래서 우회한 재시작법에 대해 알아보자


해결방법으론 간단하게 timertask를 매번 새로 생성시키는 것이다 

아래 예제를 보고 이해해보자 

public class MainActivity extends AppCompatActivity {

    private Button btn_start;
    private Button btn_stop;
    private final Timer mTimer = new Timer();
    private TimerTask mTimerTask;
    private final int UPDATE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_start = findViewById(R.id.btn_start);
        btn_stop = findViewById(R.id.btn_stop);
        
        //start버튼을 클릭할시 타이머테스크를 새로 create하고 schedule함수로 동작시킨다
        //매번 새로운 timertask를 생성하는것이다
        btn_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mTimerTask = createTimerTask();
                mTimer.schedule(mTimerTask, 1000, 1000);
            }
        });
        
		//타이머테스크를 종료시킨다
        btn_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mTimerTask != null)
                    mTimerTask.cancel();
            }
        });
        
    }

	//실제 메세지를 받아 동작할 핸들러
    private final Handler mHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case UPDATE:
                    updateStatus();
                    break;
            }
        }
    };
    
    //타이머 테스크 생성, 동작은 핸들러로 메세지를 넘겨서 동작시킨다
    private TimerTask createTimerTask() {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                mHandler.sendEmptyMessage(UPDATE);
            }
        };
        return timerTask;
    }

	//핸들러에서 수행한 동작
    private void updateStatus() {
        Log.d("test", "update");
    }
}

 

위와같이 매번 타이머 테스크를 생성해주고 중복생성 되지 않도록 주의한다

또한 이미 종료되었는지 확인을 위해 null값 체크 후 cancel을 해주면 된다

 


틀린내용이나 질문은 댓글로 남겨주세요

728x90