2012-03-02 66 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智能手機用戶取消