Вопрос

Даже при плохом соединении с сетью?

В частности, я написал код, который запускает отдельный поток (из пользовательского интерфейса), который пытается загрузить файл через HTTP POST.Однако я обнаружил, что если соединение плохое, процессор зависает на выводе outputstream.close() или httpconnection.getheaderfield() или на любом чтении/записи, которое принудительно передает данные по сети.Это приводит не только к зависанию потока, но и к захвату всего процессора, поэтому даже пользовательский интерфейс перестает отвечать на запросы.

Пробовал снизить приоритет потока, но безрезультатно.

Моя теория состоит в том, что не существует простого способа избежать такого поведения, поэтому все руководства по j2me инструктируют разработчиков создавать экран «отправка данных по сети…», а не просто отправлять все в фоновом потоке.Если кто-то сможет доказать, что я неправ, это было бы здорово.

Спасибо!

Это было полезно?

Решение

Одним из важных аспектов является необходимость иметь общий пользовательский интерфейс или экран, который можно будет отобразить в случае сбоя сетевого вызова в фоновом режиме.Это практически обязательно для любого мобильного приложения, J2ME или другого.

Как сказал Хонза, это зависит от дизайна: можно сделать очень много вещей, например, предварительную выборку данных при запуске приложения или предварительную выборку данных на основе загруженного экрана (т. е. пути навигации) или наличие набор данных по умолчанию, встроенный в приложение и т. д.

Еще одна вещь, которую вы можете попробовать, — это встроенный механизм таймера, который повторяет загрузку данных через определенное время и прерывает ее, скажем, через 5 попыток или 1–2 минуты, а также отображает общий экран или сообщение об ошибке.

Некоторые телефоны в J2ME позволяют определять режим полета. Если возможно, вы можете обнаружить это и быстро отобразить соответствующий экран.

Кроме того, один из проектов, который мне помог, — это синхронизация потоков пользовательского интерфейса и сети, чтобы они не блокировали друг друга (отнеситесь к этому совету с большой долей скептицизма, поскольку у меня было довольно много интересных ошибок на некоторых телефонах Samsung и Sanyo, потому что этого)

В общем, у вас нет хорошего ответа, но есть разные стратегии.

Другие советы

Это во многом зависит от того, как вы пишете код и где вы его запускаете.В CLDC концепция многопоточности довольно ограничена, и если какой-либо поток выполняет какую-то длительную операцию, другие потоки также могут быть (и обычно блокируются) им.Это следует учитывать при разработке приложения.

Вы можете разделить данные файла на фрагменты, а затем загрузить их с несколькими попытками в случае неудачи.Это зависит от вашей стратегии применения.Если вашим приоритетом является загрузка больших объемов данных без сбоев.Вам необходимо собрать фрагменты на сервере, чтобы восстановить ваши данные.Это может потребовать дополнительных затрат на установление соединений, но вероятность того, что ваши данные будут загружены, высока.Если вы не загружаете файлы одновременно, это сработает легко.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top