org.kalmeo.util.worker
接触这个类是在Kuix的Demo中的进度条,系统提供两种实现,一种是用Worker添加WorkerTask的,一种是自己用线程,实质都是一样的,Worker是一个线程,处理自己的任务队列,为每个任务启动一个线程,只不过线程没执行一次默认修改60ms.
public static final Worker instance = new Worker();
Worker会自动创建一个自己的实例,Kuix 在initialize()中会启动这个线程.
KuixCanvas中(264行)会启动一个任务,用它来处理key和mouse事件
workerTask = new WorkerTask() {...}
另外,Worker还有另外一个作用(473行),Worker.instance.isCurrentThread()用来判断当前运行线程是否是最后一个启用的线程,以此判断当前线程是否属于当前窗口.有点难以理解,我的理解是J2ME用Thread管理所有线程,而Kuix则试图用Worker.instance管理自己的线程.
/**
* Revalidate (and repaint) the desktop as soon as possible. If the current
* thread is the worker thread the task is done immedialty else it is
* deferred to the next frame.
*/
public void revalidateAsSoonAsPossible() {
if (!Worker.instance.isCurrentThread()) {
revalidateNextFrame();
} else {
forceRevalidate();
forceRepaint();
}
}
/**
* @return <code>true</code> if the current Thread is the {@link Worker} thread
*/
public boolean isCurrentThread() {
return (Thread.currentThread() == thread);
}
KuixMidlet甚至用它来管理Midlet的生命周期,
/* (non-Javadoc)
* @see org.kalmeo.kuix.core.KuixInitializer#destroyImpl()
*/
public void destroyImpl() {
if (Worker.instance.isRunning()) {
Worker.instance.pushTask(new WorkerTask() {
/* (non-Javadoc)
* @see org.kalmeo.util.worker.WorkerTask#run()
*/
public boolean run() {
destroyApp(false);
notifyDestroyed();
return true;
}
});
} else {
destroyApp(false);
notifyDestroyed();
}
}
picturebox用它来展示动画(348行)
PopupBox用它来关闭splash的弹出窗口,duration是启动时设置的弹出时间.
/* (non-Javadoc)
* @see org.kalmeo.kuix.widget.Widget#onAdded(org.kalmeo.kuix.widget.Widget)
*/
protected void onAdded(Widget parent) {
if (duration != -1) {
Worker.instance.pushTask(new WorkerTask() {
private long startTime = System.currentTimeMillis();
/* (non-Javadoc)
* @see org.kalmeo.kuix.core.worker.WorkerTask#execute()
*/
public boolean run() {
if ((System.currentTimeMillis() - startTime) > duration) {
remove();
return true;
}
return false;
}
});
}
}
Text用它来,似乎是做走马灯效果.(205行)
TextArea用它在修改文本后,调用onChange方法,不能理解,为什么不直接调用?延时?
/* (non-Javadoc)
* @see javax.microedition.lcdui.CommandListener#commandAction(javax.microedition.lcdui.Command, javax.microedition.lcdui.Displayable)
*/
public void commandAction(Command command, Displayable displayable) {
if (command == validateCommand) {
String textBoxString = textBox.getString();
boolean changed = textBoxString != null && !textBoxString.equals(getText());
setText(textBoxString);
if (changed && onChange != null) {
Worker.instance.pushTask(new WorkerTask() {
public boolean run() {
Kuix.callActionMethod(Kuix.parseMethod(onChange, TextArea.this));
return true;
}
});
}
}
Display.getDisplay(Kuix.getCanvas().getInitializer().getMIDlet()).setCurrent(Kuix.getCanvas());
}
TextField用来弹出tip