안드로이드(Android) 백그라운드 스레드 소스 Runnable 이용해 구현

 

환경 :  Eclipse Mars, Android 4.2.2

 

이번예제는 안드로이드(Android) 백그라운드에서 Handler 를 통해 UI 변경아티클에서 만든 내용을 조금 수정할려고 합니다. Thread 클래스 대신 Runnable 인터페이스 클래스를 사용해서 변경하려 합니다.

 

안드로이드(Android) 백그라운드 스레드 소스 Runnable 이용해 구현

 

기존에 Thread 클래스를 상속받아 사용자 정의 클래스를 만들었다면 이번에는 Thread 객체를 그대로 쓰고 생성자 함수에 Runnable 클래스를 넘겨서 구현하였습니다. 결과는 동일합니다. Thread 를 이렇게도 구현을 하는구나 하는 것을 보여주기 위함입니다. 기존 소스를 Runnable 상속받는 것으로 수정합니다.

 

public class BackgroundThread implements Runnable {

	public void run() {
		while (running) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			mHandler.sendMessage(mHandler.obtainMessage());
		}
	}
}

 

그리고 스레드 객체를 만드는 소스는 다음과 같이 수정됩니다. 생성자 인수로 Runnable 객체를 넘기게 되는 것이죠. While 문을 계속 돌릴것인지를 판단하는 running 값을 셋팅하는 부분은 메인 activity 빼놨습니다.

 

private Thread backgroundThread;
backgroundThread = new Thread(new BackgroundThread());

 

아래는 스레드 부분을 Runnable 로 수정한 전체 소스 내용입니다. 입맛에 맞는 걸로 사용하시기 바랍니다.

 

import java.lang.ref.WeakReference;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class BackgroundThreadActivity extends Activity {

	private TextView myText;
	private boolean myTextOn = true;
	private final MyHandler mHandler = new MyHandler(this);
	private Thread backgroundThread;
	private boolean running = false;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_background_thread);

		myText = (TextView) findViewById(R.id.mytext);

		Toast.makeText(this, "onCreate()", Toast.LENGTH_LONG).show();
	}

	void setRunning(boolean b) {
		running = b;
	}

	// Handler 에서 호출하는 함수
	private void handleMessage(Message msg) {
		if (myTextOn) {
			myTextOn = false;
			myText.setVisibility(View.GONE);
		} else {
			myTextOn = true;
			myText.setVisibility(View.VISIBLE);
		}
	}

	@Override
	protected void onStart() {
		super.onStart();

		backgroundThread = new Thread(new BackgroundThread());
		setRunning(true);
		backgroundThread.start();
		Toast.makeText(this, "onStart()", Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onStop() {
		super.onStop();

		boolean retry = true;
		setRunning(false);

		while (retry) {
			try {
				backgroundThread.join();
				retry = false;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		Toast.makeText(this, "onStop()", Toast.LENGTH_LONG).show();
	}

	public class BackgroundThread implements Runnable {

		public void run() {
			while (running) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				mHandler.sendMessage(mHandler.obtainMessage());
			}
		}
	}

	// 핸들러 객체 만들기
	private static class MyHandler extends Handler {
		private final WeakReference<BackgroundThreadActivity> mActivity;

		public MyHandler(BackgroundThreadActivity activity) {
			mActivity = new WeakReference<BackgroundThreadActivity>(activity);
		}

		@Override
		public void handleMessage(Message msg) {
			BackgroundThreadActivity activity = mActivity.get();
			if (activity != null) {
				activity.handleMessage(msg);
			}
		}
	}
}
Posted by 녹두장군