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
'운동하는 개발자 > Android' 카테고리의 다른 글
[서비스종료] 스마트 모바일 앱개발지원센터 SMAC 사용하기 / 모바일기기 테스트 (0) | 2021.02.09 |
---|---|
국내/외 모바일 기기별 앱 테스트 서비스 비교 (3) | 2021.02.09 |
안드로이드 소스코드 난독화, 최적화 / Android Proguard rules(optimization, Obfuscated) (0) | 2021.02.01 |
안드로이드 스튜디오 AAR파일 등록 / how about to "Android studio" insert Module(. AAR) (0) | 2021.02.01 |
안드로이드 스튜디오 aar 릴리즈 / Android Studio aar Release (2) | 2021.01.29 |