ProgressDialog가 사용되는 경우는 대부분 시간이 많이 소요되는 연산을 스레드에서 실행할때 사용자에게 대기하도록 하는 용도입니다. 그러나 이 글의 제목에서 언급된 스레드는 ProgressDialog를 생성하고 표시(Show)하는 코드가 스레드에 위치하는 경우를 의미합니다.
블랙포인트라는 모바일 GIS 엔진에서 지도를 처음 그리기 시작할때 발생하는 이벤트와 지도가 모두 다 그려질때 발생하는 이벤트의 리스너는 각각 OnBeforeMapDrawEventListener와 OnUpdateMapCompletedEventListener입니다. 이 이벤트 리스너가 호출되는 위치가 바로 그리기 스레드(Rendering Thread)이므로 Handler를 사용하여 ProgressDialog를 생성하고 표시해줘야 합니다.
private static ProgressDialog progressDialog = null;
@Override
public void onBeforeMapDraw(BeforeMapDrawEvent event) {
Message msg = new Message();
msg.what = 0;
msg.obj = event;
handler.sendMessage(msg);
}
@Override
public void onUpdateMapCompleted(UpdateMapCompletedEvent event) {
handler.sendEmptyMessage(1);
}
private static Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(msg.what == 0) {
BeforeMapDrawEvent event = (BeforeMapDrawEvent)msg.obj;
if(event.isCalledUpdateMethod()) {
if(MainActivity.progressDialog == null) {
MainActivity.progressDialog = ProgressDialog.show(
event.getMap().getContext(), "",
Html.fromHtml(
"Please wait for map drawing ..."));
Window dlgWin = MainActivity.progressDialog.getWindow()
dlgWin.setGravity(Gravity.BOTTOM);
}
}
} else if(msg.what == 1) {
if(MainActivity.progressDialog != null) {
MainActivity.progressDialog.hide();
MainActivity.progressDialog = null;
}
}
}
};
스레드로부터 안전한 ProgressDialog를 표시하는 중요한 코드는 16번 코드부터입니다. 아래는 위의 코드가 적용되어 실제 실행되는 화면입니다.
