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