的话线程就和前台的UI紧密的耦合在一起了。与其这样,倒不如让后台线程去查询UI的状态。这 样UI并不关心到底是谁在后台维护他状态。
2)如果要实现一个不交互动画UI,那么显然这个UI是自维护的(也就是说UI单独有自己的绘画线程) 。为了能够实现这种情况,可以在show中开启线程,在exit中结束线程。对于交互UI,可以简单的忽略 exit方法。
下面给一个利用Form和Gauge实现的交互式UI(非自维护的),读者可以看看其中的细节,参照他可以 设计自己的用Canvas实现的,或者自维护的等等不同的实现。
ProgressGaugeUI.java
package com.favo.ui;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
/**
* @author Favo
* Preferences - Java - Code Style - Code Templates
*/
public class ProgressGaugeUI implements ProgressObserver, CommandListener {
private static final int GAUGE_MAX = 8;
private static final int GAUGE_LEVELS = 4;
private static ProgressGaugeUI pgUI;
private Form f;
private Gauge gauge;
private Command stopCMD;
boolean stopped;
boolean stoppable;
int current;
protected ProgressGaugeUI() {
f = new Form("");
gauge = new Gauge("", false, GAUGE_MAX, 0);
stopCMD = new Command("Cancel", Command.STOP, 10);
f.append(gauge);
f.setCommandListener(this);
}
public static ProgressGaugeUI getInstance() {
if (pgUI == null) {
return new ProgressGaugeUI();
}
return pgUI;
}
public void reset() {
current=0;
gauge.setValue(0);
stopped=false;
setStoppable(false);
setTitle("");
setPrompt("");
}
public void updateProgress(Object param1) {//这里的参数设计为提示语
current=(current+1)%GAUGE_LEVELS;
gauge.setValue(current * GAUGE_MAX/GAUGE_LEVELS);
if(param1!=null && param1 instanceof String){
setPrompt((String)param1);
}
}
public boolean isStoppable() {
return stoppable;
}
public void setStoppable(boolean stoppable) {
this.stoppable = stoppable;
if(stoppable){
f.addCommand(stopCMD);
}else{
f.removeCommand(stopCMD);
}
}
public boolean isStopped() {
return stopped;
}
public void setStopped(boolean stopped) {
this.stopped=stopped;
}
public void setTitle(String title) {
f.setTitle(title);
}
public void setPrompt(String prompt) {
gauge.setLabel(prompt);
}
public void commandAction(Command arg0, Displayable arg1) {
if(arg0==stopCMD){
if(isStoppable())
stopped=true;
else{
setPrompt("can''t stop!");
}
}
}
public void show(Display display) {
display.setCurrent(f);
}
public void exit() {
// 忽略
}
public void setMax() {
gauge.setValue(GAUGE_MAX);
}
}
j2me进度条与线程化模型(4)
时间:2011-08-11 FavoYang
后台线程的设计
后台线程替我们作以下的内容:
1)执行我们的任务runTask()
2)如果用户中断线程,那么runTask()运行完后,将会跳转到我们指定的失败屏幕
3)在最后替我们调用UI.exit()
我们需要做的:
1)提供一个前台的UI,提供失败后跳转的画面,提供Display的实例
2)在runTask()中,如果任务完成,手工跳转失败画面
3)在runTask()中,如果任务失败,手工跳转失败画面
|