Многие приложения 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) Как применение ионам не разрешено блокировать поток событий, как они ожидают обработки пользовательского интерфейса? 2) Как фоновый поток обновляет пользовательский интерфейс?
Эта статья призвана помочь в решении этих проблем и обеспечить полностью функционирующий всплывающий экран «Пожалуйста, подождите». Однако, поскольку в этой статье достаточно много объяснений, мы просто создадим всплывающее окно, которое покажет себя, задержит пользовательский интерфейс, а затем удалит его после завершения фоновой обработки. Это не дает нам никаких указаний о прогрессе и не позволяет пользователю отменить ожидание. Эти пункты будут рассмотрены в последующей статье. Но код, содержащийся в этой статье, будет полезен в любом случае, особенно когда продолжительность фоновой обработки неизвестна, и пользователь не может отменить обработку.
Во-первых, мы начнем с обработки фона, которую нам нужно запустить.Хотя это может быть что угодно, как правило, это будет сетевая обработкой, как следующее:
httpConn = (HttpConnection)Connector.open(_url + ";deviceside=true");
responseCode = httpConn.getResponseCode();
responseMessage = "Response Code: " + Integer.toString(responseCode);
Чтобы начать эту обработку сети, мы имеем В начале, содержащий
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);
Мы хотели бы, чтобы MainScreen обновлялся с результатом. Как отмечено выше, фоновая обработка не может напрямую обновлять пользовательский интерфейс; Код обновления 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, который diplayed с использованием кода в 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 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-архив, содержащий источник, включенный в эту статью.
В следующей статье мы расширим этот код, чтобы иметь возможность обрабатывать:
а) обновления состояния от фонового потока
б) «Время идти» Индикация
с) Отменяется пользователем смартфона BlackBerry
спасибо за ваш ответ, но если процесс заканчивается менее 90 секунд, как я могу отменить отмену? – kaplanfat
внутри моего ответа, я объяснил, что вы можете называть timer.cancel(); –