2013-12-09 113 views
0

我有一个BlackBerry App,当一个按钮的状态设置为ON时,它通过Web服务发送数据。当按钮是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; 
      } 

我的问题:应用程序冻结时调用该方法,即每当定时器具有执行数据并将数据发送到应用程序冻结的Web服务 - 有时几秒钟,并且有时需要相当长的时间才能应用于用户,就好像手机已经挂起一样。这能解决吗?请帮助!

回答

2

您正在Event Thread上运行您的网络操作 - 即处理应用程序的Ui交互的相同Thread。网络是一个阻止操作,所以这有效地阻止了你的UI操作。在事件线程上做这件事是不推荐的,说实话,我很惊讶它不会导致你的应用程序被终止,因为如果它认为应用程序阻塞了事件线程,这通常是操作系统将要做的事情。

解决此问题的方法是使用单独的线程开始您的网络处理。这通常是比较容易的部分,困难的部分是

  1. 从做其他事情阻止用户在等待 响应(假设你需要做到这一点)
  2. 与结果更新用户界面的网络 处理

我认为,这些问题的第二个在这个主题讨论: adding-field-from-a-nonui-thread-throws-exception-in-blackberry

由于APPE ars你试图在后台定期做这个更新,我不认为第一个问题 - 为了完整性,你可以搜索SO的答案,包括这一个: blackberry-please-wait-screen-with-time-out

有更多的信息这里关于事件线程:

Event Thread

+0

感谢您的解释,我并不真正关心你提到的两个点。如何使用单独的线程启动网络进程?网络过程采用单独的方法。我应该通过thread.start调用这个方法吗? – Sarah

相关问题