Kuix 教程7 Worker
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