黑莓请等待屏幕超时

时间:2012-03-02 12:17:37

标签: blackberry timer screen wait

您好我正在尝试创建一个请等待屏幕。当我的程序从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)
    {

    }
}

2 个答案:

答案 0 :(得分:1)

许多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

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;