Многим приложениям для смартфонов BlackBerry® необходимо ожидать какой-либо сетевой активности (или другой операции блокировки, которая должна выполняться в фоновом режиме), при этом все еще удерживая пользовательский интерфейс (UI) и отображая индикатор выполнения.
Вы можете перейти по этим ссылкам
Ссылки
Пример экрана «Пожалуйста, подождите» - часть 1
Пример экрана «Пожалуйста, подождите» - часть 2
Пример экрана «Пожалуйста, подождите» - часть 4
, вы можете загрузить простые примеры экрана Пожалуйста, подождите
PleaseWait1.zip 25 КБ
PleaseWait2.zip 25 КБ
PleaseWait3.zip 25 КБ
Примечание: в случае, если вышеуказанные ссылки не работают, просто следуйте следующему содержанию
Кажется, что при программировании этого есть две общие проблемы:
1) Какприложениям не разрешено блокировать поток событий, как они заставляют обработку пользовательского интерфейса ждать?2) Как фоновый поток может обновлять пользовательский интерфейс?
Эта статья призвана помочь с этими проблемами и предоставить полнофункциональный пример всплывающего окна «Пожалуйста, подождите».Однако, как есть много объяснений, в этой первой статье мы просто создадим всплывающее окно, которое покажет себя, задержит пользовательский интерфейс, а затем удалит себя после завершения фоновой обработки.Это не дает нам никакого индикатора прогресса и не позволяет пользователю отменить ожидание.Эти моменты будут рассмотрены в следующей статье.Но код, поставляемый с этой статьей, будет полезен в любом случае, особенно когда продолжительность фоновой обработки неизвестна и пользователь не может отменить обработку.
Сначала мы начнем с фоновой обработки, которую нам нужно запустить.Хотя это может быть что угодно, обычно это будет сетевая обработка, например:
httpConn = (HttpConnection)Connector.open(_url + ";deviceside=true");
responseCode = httpConn.getResponseCode();
responseMessage = "Response Code: " + Integer.toString(responseCode);
Чтобы начать эту сетевую обработку, у нас есть MainScreen, который содержит
1) BasicEditField, который позволяетзапись URL
2) RichTextField, который должен отображать код ответа (или сообщение об ошибке).Вот важные части этого экрана:
BasicEditField _requestedURLField = new BasicEditField("http://", "www.blackberry.com", 255, BasicEditField.FILTER_URL);
RichTextField _responseField = new RichTextField("<response code>", RichTextField.NON_FOCUSABLE);
Мы бы хотели, чтобы основной экран обновлялся с результатом.Как отмечалось выше, фоновая обработка не может напрямую обновлять пользовательский интерфейс;Код обновления пользовательского интерфейса должен быть в потоке событий.Есть несколько способов получить фоновый процесс в ветке событий, подробнее см. В соответствующей статье.В этом случае мы будем использовать следующий код:
// 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, которая представляет собой объект, который содержит открытый запуск void () метод, который должен быть выполнен.В этом случае у нас есть код подключения и код обновления экрана, приведенные выше, которые должны быть выполнены.Таким образом, этот код упакован в новый 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, содержащий источник, включенный в эту статью.
В следующей статье мы расширим этокод для обработки:
a) Обновления статуса из фоновой нити
b) Индикация «Время до конца»
c) Отмена пользователем смартфона BlackBerry