BlackBerry Пожалуйста, подождите экран с тайм-аут - PullRequest
0 голосов
/ 02 марта 2012

Здравствуйте. Я пытаюсь создать экран ожидания, пожалуйста. Этот экран появится, когда моя программа запрашивает данные из веб-службы, и будет скрыт, когда процесс завершится. Также я хочу добавить тайм-аут, если процесс запроса длится дольше 90секунд.

Может кто-нибудь помочь или показать мне руководящий пример по этому вопросу.

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)
    {

    }
}

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Многим приложениям для смартфонов 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

0 голосов
/ 02 марта 2012

Просто установите таймер после того, как вы показываете занятое диалоговое окно.

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

это время ожидания.Если процесс заканчивается менее чем за 90 секунд, вы должны позвонить

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