JHB의 프로그래밍 삽질기

[Android] Thread Kill (interrupt) 본문

PROGRAMMING/Android/Java

[Android] Thread Kill (interrupt)

roter 2010.10.18 01:41


안드로이드 쓰레드 종료를 위해
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) 예제에서는 다른 액티비티로 넘어갈 때 쓰레드를 죽이기 위하여 이런 식으로 구현 하였다.
저작자 표시 비영리 변경 금지
신고
6 Comments
댓글쓰기 폼