자바스크립트는 싱글스레드라 복잡한 화면을 렌더링하면서 MessageBox 로 progress 를 보여줄 경우 재대로 표시가 되지 않는 경우가 있습니다. 이러한 경우에는 Timer 를 통해서 딜레이를 주어서 차례대로 실행하면 원하는 효과대로 처리할 수 있습니다.
접기
03
ProgressManager progressManager =
new
ProgressManager();
05
progressManager.add(
new
ProgressTimer<Map>(dataMap,
5
,
30
,
"progress message 1"
) {
06
public
void
progressRun() {
07
Map dataMap = getData();
12
progressManager.add(
new
ProgressTimer<Map>(dataMap,
5
,
50
,
"progress message 2"
) {
13
public
void
progressRun() {
14
Map dataMap = getData();
19
progressManager.add(
new
ProgressTimer(
5
,
85
,
"progress message 3"
) {
20
public
void
progressRun() {
25
progressManager.start();
진행할 과정들을 나눈 후에 ProgressTimer 를 구현하여 progressRun 메소드에서 실행하도록 한후 ProgressManager 에 추가하는 방식으로 추가된 순서대로 실행을 하도록 하는 방식입니다. 약간의 딜레이가 있을 경우에는 프로세스가 화면 렌더링을 하기전에 즉, 화면이 멈춰보이는 상태 전에 MessageBox 의 progress 를 업데이트합니다.
추가적으로 생성할 때 내부에서 사용할 객체를 넘겨주기 때문에 필요한 객체를 효과적으로 사용할 수 있습니다.
[#M_관련 소스|접기|
ㅁ ProgressManager.java
01
public
class
ProgressManager {
06
private
ProgressTimer firstTimer;
11
private
ProgressTimer lastTimer;
14
* ProgressTimer 를 추가합니다.
15
* @param timer 추가할 타이머
17
public
void
add(ProgressTimer timer) {
18
if
(firstTimer ==
null
) {
22
lastTimer.setNextTimer(timer);
28
* first ProgressTimer를 시작합니다.
31
if
(firstTimer !=
null
) {
32
firstTimer.schedule(firstTimer.getDelayMillis());
ㅁ ProgressTimer.java
01
import
com.google.gwt.user.client.Timer;
02
import
com.gwtext.client.widgets.MessageBox;
04
public
abstract
class
ProgressTimer<T>
extends
Timer {
14
private
int
delayMillis;
19
private
int
percentage;
24
private
String message;
29
private
ProgressTimer nextTimer;
31
public
ProgressTimer(
int
delayMilli,
int
percentage) {
32
this
(
null
, delayMilli, percentage);
35
public
ProgressTimer(T data,
int
delayMilli,
int
percentage) {
36
this
(data, delayMilli, percentage, percentage +
"%"
);
39
public
ProgressTimer(
int
delayMilli,
int
percentage, String message) {
40
this
(
null
, delayMilli, percentage, message);
43
public
ProgressTimer(T data,
int
delayMilli,
int
percentage, String message) {
45
this
.delayMillis = delayMilli;
46
this
.percentage = percentage;
47
this
.message = message;
54
public
int
getDelayMillis() {
58
public
void
setNextTimer(ProgressTimer nextTimer) {
59
this
.nextTimer = nextTimer;
65
if
(nextTimer !=
null
) {
66
nextTimer.schedule(nextTimer.getDelayMillis());
72
public
abstract
void
progressRun();
74
public
void
schedule(
int
delayMillis) {
75
MessageBox.updateProgress(percentage, message);
76
super
.schedule(delayMillis);
접기
아직 불안불안 합니다. ㅋㅋㅋ