- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[안드로이드] Thread Kill (interrupt) 본문
안드로이드 쓰레드 종료를 위해
Thread.stop(), Thread.suspend() 다 해보았지만 모두 deprecated 되어서 사용하면 안될 뿐더러, 정상 동작 하지도 않는다.
그럼 남은건 interrupt() 하나 뿐인데.. 이걸 쓴다고 해서 쓰레드가 바로 종료되는건 아니더라..
보니까 interrupt() 쓴다고 쓰레드가 그냥 죽는게 아니고 쓰레드 내부에 직접 구현을 해줘야 했다.
중복 쓰레드 실행 시 이전 쓰레드를 죽이는 것도 처음에 boolean 변수 만들어서 죽여주는 그런 방법으로 시도했다가, interrupt()와 interrupted()를 활용 하는 것이 훨씬 간결 하다는 것을 알았다.
구현 소스는 다음과 같다.
-------------------------------------------------------------------------------------
public class ThreadKillDemo extends Activity {
private int i = 0;
Thread threadTest;
@Override
public void onStop(){
super.onStop();
if(threadTest != null && threadTest.isAlive())
threadTest.interrupt();
}
@Override
public void onResume(){
super.onResume();
i = 0;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTest = (Button)findViewById(R.id.btn_thread_start);
btnTest.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(threadTest != null && threadTest.isAlive()) //반드시 null검사를 선행해야 한다. ※앞의 값이 false면 후행 검사는 하지 않는다.
threadTest.interrupt(); //Thread를 interrupt 한다.
i++;
threadTest = new Thread(new Runnable() {
@SuppressWarnings("static-access")
public void run() {
int j = i;
while(!threadTest.interrupted()){ //interrupted 부분을 구현해준다. interrupt 호출 시 interrupted는 true 반환.
SystemClock.sleep(1);
Log.i("THREADKILL","WORKING "+j);
}
}
});
threadTest.start();
}
});
Button btnNext = (Button)findViewById(R.id.btn_next);
btnNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(ThreadKillDemo.this, ActivityTest.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
});
}
}
-------------------------------------------------------------------------------------
p.s) interrupt 쓰는 순간 바로 스레드를 죽여보고 싶은데 그건 아무래도 힘들것 같고 적어도 루프 한번은 돌아야 죽일 수 있는 것 같다;;
p.s2) 예제에서는 다른 액티비티로 넘어갈 때 쓰레드를 죽이기 위하여 이런 식으로 구현 하였다.'★─Programing > ☆─Android' 카테고리의 다른 글
[안드로이드] WiFi Direct in Android 4.0 API Overview (번역) (0) | 2013.06.03 |
---|---|
[안드로이드] 안드로이드 단말기 OS 버전 알아오기 (0) | 2013.06.03 |
[안드로이드] Manifest에서의 exported="false"에 대한 주의점 (0) | 2013.05.31 |
[안드로이드] 실행중인 어플에서 다른 어플 실행시키기 (0) | 2013.05.31 |
[안드로이드] Activity에 대해서 - 객체 직렬화편(Serializable) (2) | 2013.05.31 |