Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) 스레드(Thread) 이용한 ProgressDialog 구현하기

안드로이드 개발

안드로이드(Android) 스레드(Thread) 이용한 ProgressDialog 구현하기

 

환경 : Eclipse Mars, Android 4.2.2

 

안드로이드에서 ProgressDialog 를 구현하기 위해서는 두가지 방법이 있습니다. 시간이 걸리는 작업은 사용자들에게 진행중이라는 메시지를 남기기 위해 ProgressDialog 를 이용합니다. ProgressDialog 은 보통 Thread AsyncTask 중에 하나와 함께 쓰입니다. 이번에는 Thread 와 함께 ProgressDialog 를 이용하는 방법에 대해 알아 보겠습니다.

 

 

Thread ProgressDialog 를 함께 이용해서 기능을 구현하실려면 Handler 객체가 필요합니다. Handler ProgressDialog 가 있는 Thread 와 메인 Thread 간의 메시지를 주고 받기 위해서 필요합니다. 왜냐하면 ProgressDialog 의 진행사항이나 종료 여부를 알려줘야 하기 때문이죠. 알릴때는 Handler sendMessage() 를 이용하시면 됩니다.

public class BackgroundThread extends Thread {
	volatile boolean running = false;
	int cnt;

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

	@Override
	public void run() {
		
		while (running) {
			try {
				sleep(1000);
				if (cnt-- == 0) {
					running = false;
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		handler.sendMessage(handler.obtainMessage());
	}
}

 

Thread 에서 Handler 를 통해 종료 메시지를 받았습니다. 그럼 다이얼로그의 dismiss() 함수로 창을 닫고 Thread 가 종료할 때 까지 join() 함수를 통해 기다립니다.

Handler handler = new Handler() {

	@Override
	public void handleMessage(Message msg) {
		
		mProgressDialog.dismiss();

		boolean retry = true;
		while (retry) {
			try {
				mBackThread.join();
				retry = false;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		Toast.makeText(ProgressDialogThreadActivity.this,
				"종료되었습니다.", Toast.LENGTH_LONG).show();
	}
};

 

▼ 메인 Activity 에서 사용할 Thread 클래스가 준비되었습니다. 이제 show() 함수로 ProgressDialog 를 띄우고 Thread start() 함수로 실행합니다. 반복이 끝날 때 까지 진행되다가 종료되면 Handler 를 통해 메시지가 오겠죠.

mProgressDialog = ProgressDialog.show(
		ProgressDialogThreadActivity.this, "진행 다이얼로그",
		"잠시만 기다려주세요..");

mBackThread = new BackgroundThread();
mBackThread.setRunning(true);
mBackThread.start();

 

▼ 아래 소스는 ProgressDialog Thread 와 함께 구현한 전체 소스 입니다. Thread Handler 를 추가로 구현해 줘야 하기 때문에 번거롭습니다. 그래서 AsyncTask 많이 이용하죠.

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class ProgressDialogThreadActivity extends Activity {

	private ProgressDialog mProgressDialog;
	private BackgroundThread mBackThread;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_progress_dialog_thread);
		
		Button button = (Button) findViewById(R.id.btn_alert);
		button.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				mProgressDialog = ProgressDialog.show(
						ProgressDialogThreadActivity.this, "진행 다이얼로그",
						"잠시만 기다려주세요..");

				mBackThread = new BackgroundThread();
				mBackThread.setRunning(true);
				mBackThread.start();
			}
		});
	}

	public class BackgroundThread extends Thread {
		volatile boolean running = false;
		int cnt;

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

		@Override
		public void run() {
			
			while (running) {
				try {
					sleep(500);
					if (cnt-- == 0) {
						running = false;
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			handler.sendMessage(handler.obtainMessage());
		}
	}

	Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			
			mProgressDialog.dismiss();

			boolean retry = true;
			while (retry) {
				try {
					mBackThread.join();
					retry = false;
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			Toast.makeText(ProgressDialogThreadActivity.this,
					"종료되었습니다.", Toast.LENGTH_LONG).show();
		}
	};
}

 

 

 

Posted by 녹두장군

댓글을 달아 주세요