2012-03-02 7 views
0

Привет, я пытаюсь создать экран ожидания. Этот экран появится, когда моя программа запросит данные из веб-службы и скроется, когда процесс будет завершен. Также я хочу добавить тайм-аут если процесс запроса длится дольше 90 секунд.BlackBerry Please Wait Screen with Time out

может кто-нибудь помочь или показать мне ориентировочный пример в этом отношении.

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

+0

внутри моего ответа, я объяснил, что вы можете называть timer.cancel(); –

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) Как применение ионам не разрешено блокировать поток событий, как они ожидают обработки пользовательского интерфейса? 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