Лучшие практики Blackberry HTTPConnection - PullRequest
3 голосов
/ 05 марта 2010

Я занимаюсь разработкой проекта для ББ.Приложение работает с сетью и отправляет / получает данные через HTTP.Теперь я использую очередь и администратор очередей.Диспетчер запускается с фоновым потоком и работает в цикле while (true), проверяя очередь на наличие новых транзакций на сервере.Если очередь не пуста, то транзакция выполняется, в противном случае менеджер переходит в спящий режим на 200 мс.

Процесс транзакции выглядит следующим образом: - запускается другой поток (с использованием Runnable), который открываетподключение к сети и первый поток, ожидающий фоновый поток или тайм-аут (и для этого нам нужен цикл), который мы установили.- Если соединение установлено, то запускается другой поток (с помощью Runnable), который запускает getResponseCode (), и первый поток ожидает фоновый поток или тайм-аут (и для этого нам нужен цикл), который мы установили.

Перед этим мы показываем всплывающее окно с ожиданием вращающегося изображения, а после него убираем.Он синхронизируется через Application.getEventLock ().

Иногда он нестабилен, а поток спит в течение длительного времени, игнорируя цикл ожидания-ожидания.

Я хотел бы знать, насколько обоснован такой подход, чтоСоветы и лучшие практики, какой у вас опыт?

Я использую 4.5, 4.6, 4.7 и 5.0.

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

Блокировка, возвращаемая Application.getEventLock(), должна использоваться только для кода, который изменяет компоненты пользовательского интерфейса или пользовательского интерфейса - это блокировка, используемая диспетчером событий. Вы не должны использовать его для фоновых задач, таких как обработка HTTP. Если вы хотите синхронизировать этот код, лучше всего создать свой собственный объект блокировки.

1 голос
/ 16 сентября 2013

Вам не нужно столько потоков, ваш EDT (поток рассылки событий, известный как основной поток) должен вставить свое задание (некоторый исполняемый класс) в очередь и использовать wait / notify, чтобы сообщить выделенному рабочему потоку, который отвечает за сеть.транзакция, чтобы проверить очередь.Рабочий поток будет отвечать за открытие соединения, запись в соединение и чтение из него.

Информацию о механизме ожидания / уведомления смотрите: Простой сценарий с использованием wait () и notify () в java

В связи с тем, что вы не можете обновить пользовательский интерфейс с помощью рабочего потока, после завершения сетевой транзакции вы можете обновить слой пользовательского интерфейса с помощью InvokeLater

.на http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/system/Application.html#invokeLater(java.lang.Runnable)

вы можете установить тайм-аут в самом HTTPConnection, но если вы не хотите полагаться на этот механизм, вы можете запланировать TimerTask, который будет выполняться через некоторое время и обрабатывать тайм-аут в случаеответ не получен.После получения ответа все, что вам нужно сделать, это отменить функцию TimerTask, чтобы тайм-аут не сработал.

Checkout http://www.blackberry.com/developers/docs/4.0api/java/util/TimerTask.html

...