许多BlackBerry®智能手机应用程序需要等待一些网络活动(或其他阻塞操作,必须在后台处理),同时还阻碍了用户界面(UI)并显示进度指示器。
您可以通过这个后续的联系
链接
Sample "Please Wait" screen - part 1
Sample "Please Wait" screen - part 2
Sample "Please Wait" screen - part 4
你可以下载简单的例子为请等待屏幕
PleaseWait1.zip 25 KB
PleaseWait2.zip 25 KB
PleaseWait3.zip 25 KB
注:如果以上链接不能再工作只要按照下列内容
似乎有是两个常见的问题编程这个时候:
1)作为应用离子不允许阻塞事件线程,他们如何获得UI处理等待? 2)后台线程如何更新UI?
本文旨在帮助解决这些问题并提供功能齐全的“请稍候”样本弹出式屏幕。然而,有很多需要解释的,在第一篇文章中,我们将创建一个弹出屏幕,它将显示自己,阻止UI,然后在后台处理完成后自行移除。这不会给我们任何进度指示,也不会让用户取消等待。这些观点将在后续文章中介绍。但是随本文提供的代码无论如何都是有用的,特别是当后台处理的持续时间未知并且用户可能不取消处理时。
首先,我们从我们需要运行的后台处理开始。虽然这可以是任何东西,通常这将是网络处理,如下所示:
httpConn = (HttpConnection)Connector.open(_url + ";deviceside=true");
responseCode = httpConn.getResponseCode();
responseMessage = "Response Code: " + Integer.toString(responseCode);
要启动该网络处理,我们有一个包含
1)BasicEditField允许的条目的MainScreen URL
2)应显示的响应代码(或错误消息A RichTextField)。以下是该屏幕的重要组成部分:
BasicEditField _requestedURLField = new BasicEditField("http://", "www.blackberry.com", 255, BasicEditField.FILTER_URL);
RichTextField _responseField = new RichTextField("<response code>", RichTextField.NON_FOCUSABLE);
我们希望MainScreen与结果进行更新。如上所述,后台处理不能直接更新UI; UI更新代码必须位于Event Thread上。有几种方法可以将后台进程加入到Event Thread中,请参阅相关文章。在这种情况下,我们将使用下面的代码:
// Make things final so we can use them in the inner class
final String textString = responseMessage;
final RichTextField rtf = _resultField;
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
rtf.setText(textString);
}
});
现在,我们必须定义PleaseWaitPopupScreen在等待被显示。
为了给用户的东西来看待,而他们正在等待,我们有动态.gif,这是使用在AnimatedGIFField代码(见相关链接)diplayed。而且,这样用户知道他们正在等待时,PleaseWaitPopupScreen与字符串显示提供,如下面的构造显示:
private PleaseWaitPopupScreen(String text) {
super(new VerticalFieldManager(VerticalFieldManager.VERTICAL_SCROLL | VerticalFieldManager.VERTICAL_SCROLLBAR));
GIFEncodedImage ourAnimation = (GIFEncodedImage) GIFEncodedImage.getEncodedImageResource("cycle.agif");
_ourAnimation = new AnimatedGIFField(ourAnimation, Field.FIELD_HCENTER);
this.add(_ourAnimation);
_ourLabelField = new LabelField(text, Field.FIELD_HCENTER);
this.add(_ourLabelField);
}
PleaseWaitPopupScreen提供了一种方法 - showScreenAndWait(..) - 这将创造和显示弹出屏幕,运行后台处理,然后关闭弹出屏幕。
最后一块拼图涉及与运行该处理供给showScreenAndWait(..)。
Java有一个可运行,这是一个包含应执行的公共无效run()方法的对象的概念。在这种情况下,我们有上面给出的应该执行的连接代码和屏幕更新代码。所以,这段代码被打包成一个新的Runnable Object,它被提供给showScreenAndWait(..)。这就是这种方法。注意如何创建并运行新的线程。
public static void showScreenAndWait(final Runnable runThis, String text) {
final PleaseWaitPopupScreen thisScreen = new PleaseWaitPopupScreen(text);
Thread threadToRun = new Thread() {
public void run() {
// First, display this screen
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
UiApplication.getUiApplication().pushScreen(thisScreen);
}
});
// Now run the code that must be executed in the Background
try {
runThis.run();
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException("Exception detected while waiting: " + t.toString());
}
// Now dismiss this screen
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
UiApplication.getUiApplication().popScreen(thisScreen);
}
});
}
};
threadToRun.start();
}
这是PleaseWaitPopupScreen的关键部分。请注意,此代码在运行后台处理时将如何创建并向用户显示弹出式屏幕,包括动画图标。用户输入被弹出窗口阻止,直到处理完成。作为后台处理的结果,更新始发屏幕。
下载相关的.zip文件,其中包含本文中包含源。
在接下来的文章中,我们将扩展该代码能够处理:从后台线程
B)“时间去”的指示
C)
一)状态更新被BlackBerry智能手机用户取消
感谢您的回答,但如果过程完成时间少于90秒,我将如何调用取消? – kaplanfat 2012-03-02 13:20:12
我的回答里,我解释说,如果你调用前人的精力timer.cancel(); – 2012-03-02 13:46:20