4)在runTask()中改变进度栏的状态。
5)在runTask()中查询用户是否取消,如果用户取消,应该尽快退出runTask()
这种模型职责清晰,便于使用。但也有一个缺点:如果用户取消了任务,但是此时任务接近完成,或 者已经完成。后台线程依然会显示用户取消了任务,并将会跳转到我们指定的失败屏幕。这时候会产生不 一致的情况。为了解决整个问题,程序员可以在runTask()中调用taskComplete()来强制完成任务。这样 即使用户取消了任务,依然回显示任务成功。当然你也可以不掉用taskComplete()遵循默认的行为特点。
BackgroundTask.java
package com.favo.ui;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Alert;
/**
* @author Favo
* Preferences - Java - Code Style - Code Templates
*/
public abstract class BackgroundTask extends Thread {
ProgressObserver poUI;
protected Displayable preScreen;
protected boolean needAlert;
protected Alert alertScreen;
private Display display;
public BackgroundTask(ProgressObserver poUI, Displayable pre,
Display display) {
this.poUI = poUI;
this.preScreen = pre;
this.display = display;
this.needAlert = false;
}
public void run() {
try {
runTask();
} catch (Exception e) {
Alert al = new Alert("undefine exception",
e.getMessage(), null,
AlertType.ALARM);
al.setTimeout(Alert.FOREVER);
display.setCurrent(al);
} finally {
if (poUI.isStoppable()) {
if (poUI.isStopped()) {//如果用户中断了程序
if (needAlert) {
display.setCurrent(alertScreen, preScreen);
} else {
display.setCurrent(preScreen);
}
}
}
poUI.exit();
}
}
/*
* 如果任务可中断,查看pgUI.isStopped().并尽快退出此方法;
* 如果任务需要更新进度栏,调用pgUI.updateProgress(“进度提示”).
* 习惯上此方法的最后手动调用taskComplete()以防止用户在任务接近
* 完成时取消
*/
public abstract void runTask();
/**
* 这是一个偷懒的办法,当你构造好BackgroundTask对象后,直接调用这个方法, *可以帮助你初始化 进度UI,并显示出来。之后启动你的任务线程
*/
public static void runWithProgressGauge(BackgroundTask btask, String title,
String prompt, boolean stoppable, Display display) {
ProgressObserver po = btask.getProgressObserver();
po.reset();
po.setStoppable(stoppable);
po.setTitle(title);
po.setPrompt(prompt);
po.show(display);
btask.start();
}
public ProgressObserver getProgressObserver() {
return poUI;
}
public void taskComplete(){
getProgressObserver().setStopped(false);
}
}
j2me进度条与线程化模型(5)
时间:2011-08-11 FavoYang
如何使用
1)产生一个ProgressObserver 对象poUI
如果用默认的,通过调用ProgressGaugeUI.getInstance();
2)构造BackgroundTask对象bkTask,一般可以用匿名类来实现。
3)初始化poUI设置后字段显示你的poUI开启bkTask线程。
第三步可以用一步完成,通过调用静态方法
BackgroundTask.runWithProgressGauge(bkTask, "标题",
"提示", 是否可以暂停, display);
下面一个例子,看看你是否理解了,并且会使用了。
TestProgressGauge.java
package com.favo.ui;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microediti
|