제가 메뉴에서 어떤 버튼을 누르면 큰 작업이 수행되게 프로그램을 만들었습니다.
그래서 그 작업을 쓰레드로 돌리고, 쓰레드 전에 프로그레스 바를 넣었습니다.
그런데 문제는 프로그레스 바가 반바퀴 돌다가 프로그레스 바도 죽는다는데 있죠...
원인을 모르겠어요. 큰작업은 쓰레드에서 돌아갈텐데... 왜 메인 쓰레드가 죽는지...
전체적인 흐름은..
메뉴 버튼 클릭-> 파일 선택 -> 프로그레스 바 호출 -> 쓰레드 작업 실행 -> 쓰레드 완료 -> 프로그레스 바 종료
이런건데
쓰레드 작업 중에 프로그레스바도 죽는게 문제입니다.
소스를 간단히 적으면 아래와 같습니다.
// DIALOG_1 부분은 메뉴 클릭시 나오는 다이얼로그
// DIALOG_PROGRESS 는 프로그레스 바 호출
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_1:
return new AlertDialog.Builder(MainActivity.this)
.setTitle("파일을 선택하세요")
.setItems(arr, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
selectedFile = arr[which];
showDialog(DIALOG_PROGRESS);
myThread th = new myThread();
th.setDaemon(true);
th.start(); }
}).setNegativeButton("닫기", null).create();
case DIALOG_PROGRESS:
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setMessage("loading..");
mProgressDialog.setCancelable(true);
return mProgressDialog;
}
return null;
}
public class myThread extends Thread {
public void run() {
try {
Thread.sleep(1000);
// 1000을 주지 않으면 아예 프로그레스바도 호출되기 전에 멈춰버리더군요;;
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {
// TODO 자동 생성된 catch 블록
e.printStackTrace();
}
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if (msg.what == 0) {
longTime(selectedFile);
dismissDialog(DIALOG_PROGRESS);
mProgressDialog.dismiss();
}
}
};
빨간 부분이 프로그레스 바와 쓰레드 사용 부분인데요.
longTime이 메인 작업입니다.
longTime 작업시 UI 를 건드리기 때문에 핸들러를 사용했습니다.
이 작업이 시간이 오래 걸리다보니 쓰레드 처리하고 프로그레스 바를 보여주는건데
죽어버리니 아무 소용이 없더군요 ㅠㅠ 이거 왜 이럴까요;;