2012-03-02 69 views
0

您好,我正在尝试创建一个请稍候屏幕。当我的程序从网络服务请求数据时,此屏幕将显示,并且在完成此过程时将隐藏。此外,我想添加超时如果请求过程持续时间超过90秒。BlackBerry请等待屏幕超时

任何人都可以帮助或向我展示关于此事的指导性示例。

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

只要把计时器告诉你忙对话框后。

showBusyDialog(); 
Timer timer = new Timer(); 
TimerTask task = new TimerTask() { 
    public void run() { 
     hideBusyDialog(); 
    } 
}; 
timer.schedule(task, 9000); 

这是超时。如果进程完成90秒以内,你应该叫

timer.cancel(); 
timer = null; 
task = null; 
+0

感谢您的回答,但如果过程完成时间少于90秒,我将如何调用取消? – kaplanfat 2012-03-02 13:20:12

+0

我的回答里,我解释说,如果你调用前人的精力timer.cancel(); – 2012-03-02 13:46:20

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允许的条目的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智能手机用户取消