2013-12-09 2 views
0

У меня есть приложение BlackBerry, которое отправляет данные через веб-службу, когда кнопка имеет состояние, установленное в ON. Когда кнопка ON запускает таймер, который непрерывно работает в фоновом режиме с фиксированными интервалами. Метод HttpConnection называется следующим образом:BlackBerry - приложение зависает, когда выполняется фоновый поток

if(C0NNECTION_EXTENSION==null) 
{ 
Dialog.alert("Check internet connection and try again"); 
return; 
} 
else 
{ 
confirmation=PostMsgToServer(encryptedMsg); 
} 

метод PostMsgToServer выглядит следующим образом:

public static String PostMsgToServer(String encryptedGpsMsg) { 

      //httpURL= "https://prerel.track24c4i.com/track24prerel/service/spi/post?access_id="+DeviceBoardPassword+"&IMEI="+IMEI+"&hex_data="+encryptedGpsMsg+"&device_type=3"; 
     httpURL= "https://t24.track24c4i.com/track24c4i/service/spi/post?access_id="+DeviceBoardPassword+"&IMEI="+IMEI+"&hex_data="+encryptedGpsMsg+"&device_type=3"; 
     //httpURL= "http://track24.unit1.overwatch/track24/service/spi/post?access_id="+DeviceBoardPassword+"&IMEI="+IMEI+"&hex_data="+encryptedGpsMsg+"&device_type=3"; 

      try { 
       String C0NNECTION_EXTENSION = checkInternetConnection(); 
       if(C0NNECTION_EXTENSION==null) 
       { 
        Dialog.alert("Check internet connection and try again"); 
        return null; 
       } 
       else 
       { 

        httpURL=httpURL+C0NNECTION_EXTENSION+";ConnectionTimeout=120000"; 
      //Dialog.alert(httpURL); 
      HttpConnection httpConn; 
      httpConn = (HttpConnection) Connector.open(httpURL); 
      httpConn.setRequestMethod(HttpConnection.POST); 
      DataOutputStream _outStream = new DataOutputStream(httpConn.openDataOutputStream()); 
      byte[] request_body = httpURL.getBytes(); 
      for (int i = 0; i < request_body.length; i++) { 
      _outStream.writeByte(request_body[i]); 
      } 
      DataInputStream _inputStream = new DataInputStream( 
      httpConn.openInputStream()); 
      StringBuffer _responseMessage = new StringBuffer(); 
      int ch; 
      while ((ch = _inputStream.read()) != -1) { 
      _responseMessage.append((char) ch); 
      } 
      String res = (_responseMessage.toString()); 
      responce = res.trim(); 


      httpConn.close(); 
       } 
      }catch (Exception e) { 
      //Dialog.alert("Connection Time out"); 
      } 

      return responce; 
      } 

Мой вопрос: App замирает каждый раз, когда вызывается метод, то есть всякий раз, когда таймер должен выполнять и отправлять данные в веб-службу, приложение зависает - время от времени на несколько секунд и время от времени в течение значительного времени, применяя к пользователю, как если бы телефон повесился. Можно ли это решить? Пожалуйста, помогите !!

ответ

2

Выполняется сетевая операция в потоке событий, то есть тот же поток, который обрабатывает взаимодействие Ui вашего приложения. Сетевое взаимодействие - это операция блокировки, так что это прекращает работу вашего интерфейса. Не рекомендуется делать это в потоке событий, и, честно говоря, я удивлен, что это не приводит к прекращению вашего приложения, поскольку это часто происходит в ОС, если он считает, что приложение заблокировало Event Thread.

Способ решения этой проблемы - начать свою сетевую обработку с использованием отдельной темы. Это, как правило, легкая часть, трудная часть

  1. блокирование пользователя делать что-нибудь еще в ожидании ответа (при условии, что вам нужно сделать это)
  2. обновление пользовательского интерфейса с результатами вашего сетей обработки

Я думаю, что второй из этих вопросов обсуждаются в этой теме: adding-field-from-a-nonui-thread-throws-exception-in-blackberry

Поскольку Appe АРС вы пытаетесь сделать это обновление через регулярные промежутки времени в фоновом режиме, я не думаю, что первый является проблемой, - для полноты картины, вы можете найти SO ответы, включая этот один: blackberry-please-wait-screen-with-time-out

Существует больше информации относительно Нить событий здесь:

Event Thread

+0

спасибо за объяснение, я не очень обеспокоен этими двумя точками вы упомянули. Как начать сетевой процесс с помощью отдельного потока? Сетевой процесс находится в отдельном методе. Должен ли я вызвать этот метод через thread.start? – Sarah

Смежные вопросы