我有一个BlackBerry App,当按钮的状态设置为ON
时,它会通过Web服务发送数据。当按钮为ON
时,启动计时器,该计时器以固定间隔在后台连续运行。 HttpConnection
的方法调用如下:
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;
}
我的问题:每当调用该方法时,应用程序都会冻结,即每当计时器必须执行并向网络服务发送数据时,应用程序就会冻结 - 有时会持续几秒钟相当长的时间应用于用户,就像手机挂了一样。这可以解决吗?请帮助!!
答案 0 :(得分:2)
您正在事件线程上运行网络操作 - 即处理应用程序的Ui交互的相同线程。网络是一种阻止操作,因此有效地阻止了您的UI操作。不推荐在事件线程上执行此操作,说实话,我很惊讶它不会导致应用程序被终止,因为这通常是操作系统将要执行的操作,如果它认为应用程序已阻止事件线程。
解决此问题的方法是使用单独的线程开始网络处理。这通常是容易的部分,困难的部分是
我认为本主题中讨论了第二个问题: adding-field-from-a-nonui-thread-throws-exception-in-blackberry
由于看起来你正在尝试在后台定期进行此更新,我认为第一个不是问题, - 为了完整性,你可以搜索SO以获得答案,包括这个: blackberry-please-wait-screen-with-time-out
此处有关于事件线程的更多信息: