您好我正在尝试创建一个请等待屏幕。当我的程序从Web服务请求数据时,此屏幕将出现,并在进程完成时隐藏。如果请求进程持续时间超过90,我还要添加超时时间秒。
任何人都可以帮助或向我展示有关此事的指导性示例。
public static void showBusyDialog() {
try
{
if (busyDialog == null) {
busyDialog = new Dialog("Please Wait", null, null, 0, Bitmap.getPredefinedBitmap(Bitmap.HOURGLASS));
busyDialog.setEscapeEnabled(false);
}
synchronized (Application.getEventLock()) {
busyDialog.show();
}
}
catch(Exception e)
{
}
}
我的隐藏代码是
public static void hideBusyDialog() {
try
{
if (busyDialog == null) {
// busyDialog = new Dialog("Please wait...", null, null, 0, Bitmap.getPredefinedBitmap(Bitmap.HOURGLASS));
busyDialog.setEscapeEnabled(false);
}
synchronized (Application.getEventLock()) {
busyDialog.close();
}
}catch(Exception e)
{
}
}
答案 0 :(得分:1)
许多BlackBerry®智能手机应用程序需要等待某些网络活动(或其他必须在后台处理的阻止操作),同时仍然保持用户界面(UI)并显示进度指示器。
您可以按照此链接进行操作
<强>链接强>
Sample "Please Wait" screen - part 1
Sample "Please Wait" screen - part 2
Sample "Please Wait" screen - part 4
您可以下载请等待屏幕的简单示例
注意:如果上面的链接不起作用,那么只需按照以下内容
编程时似乎有两个常见问题:
1)由于不允许应用程序阻止事件线程,他们如何让UI处理等待? 2)后台线程如何更新UI?
本文旨在帮助解决这些问题,并提供功能完备的“请等待”示例弹出屏幕。但是,由于有很多要解释的内容,在第一篇文章中,我们将创建一个弹出屏幕,该屏幕将显示自身,保持UI,然后在后台处理完成后自行删除。这不会给我们任何进度指示,也不会让用户取消等待。这些要点将在后续文章中介绍。但是,本文提供的代码无论如何都会很有用,尤其是当后台处理的持续时间未知并且用户可能不会取消处理时。
首先,我们从我们需要运行的后台处理开始。虽然这可能是任何东西,但通常这将是网络处理,如下所示:
httpConn = (HttpConnection)Connector.open(_url + ";deviceside=true");
responseCode = httpConn.getResponseCode();
responseMessage = "Response Code: " + Integer.toString(responseCode);
要启动此网络处理,我们有一个包含
的主屏幕1)允许输入网址的BasicEditField
2)应显示响应代码(或错误消息)的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更新代码必须位于事件线程上。有几种方法可以将后台进程放到事件线程上,有关详细信息,请参阅相关文章。在这种情况下,我们将使用以下代码:
// 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中的代码进行显示(参见相关链接)。并且,因此用户知道他们正在等待什么,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具有Runnable的概念,它是一个包含应该执行的public void run()方法的Object。在这种情况下,我们有上面给出的连接代码和屏幕更新代码,应该执行。因此,此代码被打包到一个新的Runnable对象中,该对象提供给showScreenAndWait(..)。这是方法。注意如何创建和运行新的Thread。
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存档,其中包含本文中包含的来源。
在下一篇文章中,我们将扩展此代码以便能够处理:
a)背景线程的状态更新
b)“时间去”指示
c)被BlackBerry智能手机用户取消
答案 1 :(得分:0)
在显示忙碌对话框后立即放置计时器。
showBusyDialog();
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
hideBusyDialog();
}
};
timer.schedule(task, 9000);
这是超时的。如果过程完成时间少于90秒,您应该致电
timer.cancel();
timer = null;
task = null;