Почему J2ME Midlet Suite и HTTPConnection должны быть в разных потоках
Я хочу вызвать сервлет из мидлета J2ME, поэтому я написал код HTTPConnection для URL-адреса сервлета для вызова метода GET.
Когда пакеты Midlet пытаются подключиться к URL-адресу сервлета, в эмуляторе появляется следующее сообщение:
{#MyMidlet} Midlet Suite wants to connect to {#Servlet URL} using air time,
this may result in charges, Is it ok to use airtime ?
Если я нажимаю "Нет" или "Да", ничего не происходит, просто зависает, я использую EclipseME и SUN WTK 2.5.2. И в консоли было предупреждение,
Warning: To avoid potential deadlock, operations that may block, such as
networking, should be performed in a different thread than the
commandAction() handler.
Что означает, если я сделаю HttpConnection в отдельном потоке, будет ли проблема решена?
3 ответа
Если я сделаю HttpConnection в отдельном потоке, проблема будет решена?
Если вы все сделаете правильно - да, проблема будет решена. Это типичная проблема, и есть стандартное решение.
Предупреждение, на которое вы ссылаетесь, указывает на проблему с дизайном в вашем мидлете. У вас есть "тяжеловесная" активность (http-соединение), которая выполняется в том же потоке, что и пользовательский интерфейс, блокируя ее и делая ее не отвечающей.
Избегайте большой нагрузки в потоке событий пользовательского интерфейса. Когда есть что-то делать внутри commandAction
или же keyPressed
или же pointerPressed
и т.д., просто создайте новую ветку, чтобы сделать это. Чтобы лучше понять, почему это так, подумайте над изучением этого урока, чтобы узнать, как это сделать правильно:
Сеть, пользовательский опыт и потоки
В этой статье объясняется, как ваш мидлет может устанавливать сетевые подключения без ущерба для вашего пользовательского интерфейса. Он включает в себя шесть итеративных примеров, иллюстрирующих многопоточную сеть и использование экрана ожидания...
- После самого первого примера в уроке (
PrimitiveMidlet
), есть даже подробное объяснение проблемы, с которой вы столкнулись:... программист похитил системный поток для своей длительной обработки. Система вызывает его метод commandAction(), когда пользователь выбирает команду. Поток, вызывающий этот метод, принадлежит системе, а не разработчику. Это не было бы преступлением, если бы метод выполнялся быстро, но в этом случае сетевое соединение может долго перегружать поток системы.
В прикладном программировании J2SE и даже в программировании сервлетов система создает поток для вас, и есть немного ограничений относительно того, сколько времени может занять ваша обработка. Правило потоков мидлетов простое и строгое: единственные потоки, которые принадлежат вам, это те, которые вы создаете сами.
В мидлете вы пишете код, который система будет вызывать из одного из своих собственных потоков. Например, при вызове методов MIDA startApp(), pauseApp(), destroyApp() и обработчика событий они выполняются внутри системного потока. Ваши методы должны быстро возвращаться, чтобы системный поток мог продолжить свою другую работу. Любая задача, которая не может быть выполнена быстро, должна быть удалена из системного потока.
Этот стиль программирования может потребовать некоторого привыкания, так как вы на самом деле пишете только код, который вызывается из системных потоков. Однако, если вы уже занимались программированием с использованием графического интерфейса, этот метод будет вам знаком. AWT и Swing имеют поток диспетчеризации событий, который обрабатывает события операционной системы и вызывает обработчики событий в вашем коде. Правило такое же: обработчики событий должны выполняться быстро и возвращать управление потоку диспетчеризации событий, чтобы остальная часть интерфейса не блокировалась...
Создает свое соединение как отдельный поток, например так:
Thread myConnection = new Thread(new Runnable() {
public void run() {
// TODO open connection here
HttpConnection conn = null;
try {
conn = (HttpConnection) Connector.open(serverURL,
Connector.READ_WRITE, true);
conn.setRequestMethod(HttpConnection.GET); // or POST method
} catch (Exception e) {
// TODO: handle exception
} finally {
// close connection here
}
}
});
myConnection.start();
В J2ME сетевая операция помещается в отдельный поток.
Поместите сетевой модуль в отдельный поток. Если вы поместите сетевой модуль в отдельный поток, то следующее сообщение не появится.
Warning: To avoid potential deadlock, operations that may block, such as
networking, should be performed in a different thread than the
commandAction() handler.
В J2ME (sun/oracle, который является владельцем j2me) дает некоторые ограничения. В целях безопасности некоторым API нужны сертификаты доверенной стороны. Для этого некоторые мобильные телефоны запрашивают у пользователя разрешение, когда пользователь нажимает "да", тогда это разрешается, в противном случае это не разрешается.
Ниже приведены некоторые из API-интерфейсов, для которых предусмотрены следующие сценарии: FileConnection (чтение / запись в файл) api,HttpConnection,HttpsConnection и т. Д.
Проверьте ваше устройство, поддерживает ли оно самозаверяющий сертификат. Если это средство поддержки, вы используете самоподписанный сертификат.
Сертификат доверенной стороны является дорогостоящим. Его минимальная стоимость составляет 10000 рупий в год. Ниже приведены некоторые поставщики доверенных сторон Thawte,Verizon,Semantec и т. Д.