我正在为Blackberry开发一个使用网络功能的应用程序。按下按钮执行请求,代码如下:
mainButton=new BitmapButton(Bitmap.getBitmapResource("elcomercio.gif"), Bitmap.getBitmapResource("elcomercio.gif"), Field.FOCUSABLE){
protected boolean navigationClick(int status,int time) {
//It automatically add itself to the screen stack
waitScreen=new WaitScreen();
TimeOutThread timeOut=new TimeOutThread(HomeScreen.this, 10000);
HttpHelper helper=new HttpHelper("http://www.elcomercio.com/rss/latest", null, HomeScreen.this, HttpHelper.GET);
UiApplication.getUiApplication().invokeLater(timeOut);
UiApplication.getUiApplication().invokeLater(helper);
return true;
}
};
正如您所看到的,TimeOutThread和HttpHelper都从Thread继承,因此可以在主要的执行流程之外调用它们。它们都接收当前屏幕作为委托对象,以便我可以稍后在屏幕上执行方法。在这种情况下,timeout执行以下功能。
public void onTimeout() {
if(!didTimeout.booleanValue()){
UiApplication.getUiApplication().popScreen(waitScreen);
didTimeout=Boolean.TRUE;
}
}
超时方法被称为成功...即使waitScreen弹出也是成功的,并显示最后一个屏幕。但是UI在那一刻挂起......就像我所拥有的HttpThread仍在执行阻止UI ......我知道它因为当网络线程超时时...... UI再次响应。我做错了什么??。
答案 0 :(得分:1)
UiApplication.invokeLater()
不会在自己的执行线程中运行Thread
对象。它运行主事件调度线程中的对象 - 运行UI的相同线程。您需要使用Thread.start()
方法而不是UiApplication.invokeLater()
方法,例如:
mainButton = new BitmapButton(Bitmap.getBitmapResource("elcomercio.gif"), Bitmap.getBitmapResource("elcomercio.gif"), Field.FOCUSABLE)
{
protected boolean navigationClick(int status,int time)
{
waitScreen = new WaitScreen();
TimeOutThread timeOut=new TimeOutThread(HomeScreen.this, 10000);
HttpHelper helper = new HttpHelper("http://www.elcomercio.com/rss/latest", null, HomeScreen.this, HttpHelper.GET);
timeOut.start();
helper.start();
return true;
}
};