단일 스레드 모델이란 시스템내에서 해당 작업 또는 해당 기능을 사용하는 시점에는 반드시 하나의 스레드만 실행되어야 한다는 특징을 갖는 메서드를 말한다. 이러한 기능을 갖는 메서드나 기능들을 전문 용어로 'Thread-Unsafe'라 한다. 그리고 여러 스레드에서 동시에 멀티 태스킹으로 사용할 수 있는 메서드나 기능을 'Thread-Safe'라 부른다.
"화면 구현과 관련된 클래스나 메서드 가운데 Thread-Unsafe 인 클래스와 메서드들에 대해서만 반드시 메인 스레드 또는 핸들러에서 구현해야 한다." 또한 다이얼로그는 핸들러를 사용하여 다이얼로그에서 제공하는 메서드들은 'Thread-Safe'로 만든다는 사실이다.
package com.android.example;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ProgressBar extends Activity {
private static final int DIALOG_UIDIRECT = 1;
private static final int DIALOG_UITHREAD = 2;
private static final int DIALOG_HANDLER = 3;
private static final int MAX_PROGRESS = 100;
private ProgressDialog mProgressDialog;
private ProgressDialog TProgressDialog;
private ProgressDialog HProgressDialog;
private int mProgress;
TextView textResult;
private Handler mProgressHandler, mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textResult = (TextView)findViewById(R.id.Example);
Button ViewPostButton = (Button) findViewById(R.id.UiDirect);
Button UiThreadButton =(Button)findViewById(R.id.UiThread);
Button UiHandlerButton=(Button)findViewById(R.id.UiHandler);
mHandler = new Handler();
ViewPostButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DIALOG_UIDIRECT);
new Thread(new Runnable() {
@Override
public void run() {
// exception 발생.
// textResult.setText("UI 작업 테스트 중...");
// post() 메서드 사용.
// 결과적으로 뷰 클래스의 post() 메서드나 핸들러 클래스에서 제공하는 post() 메서드는 동일.
// textResult.post(new Runnable() {
mHandler.post(new Runnable() {
@Override
public void run() {
textResult.setText("UI 작업 테스트 중... ");
}
});
for(mProgress = 0; mProgress<=MAX_PROGRESS; mProgress+=1) {
mProgressDialog.setProgress(mProgress);
SystemClock.sleep(100);
}
mProgressDialog.dismiss();
}
}).start();
}
});
UiThreadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DIALOG_UITHREAD);
new Thread(new Runnable() {
@Override
public void run() {
for(mProgress = 0; mProgress<=MAX_PROGRESS; mProgress+=1) {
// 일반 스레드에서 메인 스레드와 연결하여 실행시키는 메서드.
runOnUiThread(new Runnable() {
//mHandler.post(new Runnable() {
@Override
public void run() {
// textResult.setText("runOnUiThread UI 작업 테스트 중...");
TProgressDialog.setProgress(mProgress);
}
});
SystemClock.sleep(100);
}
TProgressDialog.dismiss();
}
/* runOnUiThread(new Runnable() {
// mHandler.post(new Runnable() {
@Override
public void run() {
showDialog(DIALOG_UITHREAD);
for(mProgress = 0; mProgress<=MAX_PROGRESS; mProgress+=1) {
TProgressDialog.setProgress(mProgress);
SystemClock.sleep(100);
}
TProgressDialog.dismiss();
}
});
} */
}).start();
}
});
UiHandlerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DIALOG_HANDLER);
new Thread(new Runnable() {
@Override
public void run() {
mProgress = 0;
HProgressDialog.setProgress(0);
mProgressHandler.sendEmptyMessage(0);
}
}).start();
}
});
mProgressHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mProgress >= MAX_PROGRESS) {
HProgressDialog.dismiss();
} else {
mProgress++;
HProgressDialog.incrementProgressBy(1);
mProgressHandler.sendEmptyMessageDelayed(0, 100);
}
}
};
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_UIDIRECT:
mProgressDialog = new ProgressDialog(ProgressBar.this);
mProgressDialog.setIcon(android.R.drawable.ic_dialog_alert);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setMax(MAX_PROGRESS);
mProgressDialog.setButton(getText(R.string.alert_dialog_hide),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
});
mProgressDialog.setButton2(getText(R.string.alert_dialog_cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
});
mProgressDialog.setTitle("UI 작업 테스트 중...");
return mProgressDialog;
case DIALOG_UITHREAD:
TProgressDialog = new ProgressDialog(ProgressBar.this);
TProgressDialog.setIcon(android.R.drawable.ic_dialog_alert);
TProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
TProgressDialog.setMax(MAX_PROGRESS);
TProgressDialog.setButton(getText(R.string.alert_dialog_hide),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
});
TProgressDialog.setButton2(getText(R.string.alert_dialog_cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
});
TProgressDialog.setTitle("runOnUiThread 작업 테스트 중...");
return TProgressDialog;
case DIALOG_HANDLER:
HProgressDialog = new ProgressDialog(ProgressBar.this);
HProgressDialog.setIcon(android.R.drawable.ic_dialog_alert);
HProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
HProgressDialog.setMax(MAX_PROGRESS);
HProgressDialog.setButton(getText(R.string.alert_dialog_hide),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
});
HProgressDialog.setButton2(getText(R.string.alert_dialog_cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
});
HProgressDialog.setTitle("Handler 작업 테스트 중...");
return HProgressDialog;
default:
return null;
}
}
}
[Android]내부 바인드 서비스 (0) | 2013.09.21 |
---|---|
[Android]서비스 - 01 (0) | 2013.09.20 |
[Android]안드로이드 스레드 구현시 주의 사항 (0) | 2013.09.19 |
[Android]핸들러 클래스 (0) | 2013.09.19 |
[Android]스레드 구현 (0) | 2013.09.18 |
댓글 영역