Runnable timerLoop = new Runnable(){
@Override
public void run() {
while(timerThreadEnable) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
saveLog.writeLog("타이머"+timerSeconds, "" + Thread.currentThread().getName(),4,3);
timerSeconds++;
timerHandler.sendEmptyMessage(timerSeconds);
}
saveLog.writeLog("스레드종료", "" + Thread.currentThread().getName(),4,3);
}
};
private Handler timerHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//saveLog.writeLog("타이머", "" + msg.what,4,3);
tvKeepAliveTimer.setText("" + msg.what );
}
};
onCreate() 에서는
timerThread = new Thread(timerLoop);
timerThread.start();
onPause() 에서는
timerThreadEnable = false;
onResume 에서는
timerThreadEnable = true;
초기화 시킵니다
제가 의도한 동작은 액티비티에 무한루프 도는 스레드에서 매초 핸들러로 0부터 숫자를 전송해
화면에 계속 출력하는것입니다. 브로드캐스트로 값을 받아서 0으로 초기화 시키는데 잘 작동하고
필요하지 않은것 같아서 생략했습니다
인터넷에 뒤져나오면 흔하디 흔한 코드로
플래그를 주어 액티비티가 꺼지면 종료되도록 해봤습니다. 인터럽트로 해보기도 했는데 같았습니다.
문제는 처음엔 잘 작동하다가 액티비티를 백그라운드로 돌리던지 destroy 하던 화면에서 없앤후 다시 실행하면 스레드는 분명 죽었다는 출력메시지를 뿜어냈었는데 두개의 스레드로 살아납니다
그래서 출력이
1 thread-9
2 thread-9
3 thread-9
4 thread-9
5 thread-9
(액티비티 종료)
(액티비티 다시켬)
1 thread-16
1 thread-17
2 thread-16
2 thread-17
3 thread-16
3 thread-17
4 thread-16
4 thread-17
이런식으로 원래 돌던 스레드는 죽고 갑자기 두개로 늘어나서 돌아갑니다.
pause될때 스레드객체나 러너블객체등을 null로 해봤지만 소용이 없었습니다.
create에서 스레드객체가 null이 일때만 새 스레드를 만들도록 해도 마찬가지였습니다
timerThread.setDaemon(true); 이옵션도 줘봤습니다
원래 이렇게 동작하는게 맞나요?
저걸 제가 의도한대로 포즈될때 종료되고 리줌될때 한개의 스레드만 작동되게 하려면 어떻게 해야할까요?
검색해보면 저런 코드는 널리고 널렸는데
다들 액티비티를 다시 켤때 상황을 어떻게 해결했는지 궁금하네요
초보에게 도움 부탁드립니다 ㅠㅠ
-------------------------------------------------------------------------------------------------
이걸 똑같이 타겟 sdk23 새 어플로
액티비티 하나에 저 스레드관련 클래스들만 모아서 테스트를 해봤는데
이건 또 제대로 동작하네요??;;
왜지;;
위에것은 프래그먼트 안에서 돌려서 그럴까요?
도대체 이해가;;;