网络线程阻止UI

时间:2012-01-11 21:31:07

标签: blackberry java-me

我正在为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(timeO​ut);
            UiApplication.getUiApplication().invokeLater(helpe​r);
            return true;
        }
    };

正如您所看到的,TimeOutThread和HttpHelper都从Thread继承,因此可以在主要的执行流程之外调用它们。它们都接收当前屏幕作为委托对象,以便我可以稍后在屏幕上执行方法。在这种情况下,timeout执行以下功能。

public void onTimeout() {
    if(!didTimeout.booleanValue()){
        UiApplication.getUiApplication().popScreen(waitScr​een);
        didTimeout=Boolean.TRUE;
    }
}

超时方法被称为成功...即使waitScreen弹出也是成功的,并显示最后一个屏幕。但是UI在那一刻挂起......就像我所拥有的HttpThread仍在执行阻止UI ......我知道它因为当网络线程超时时...... UI再次响应。我做错了什么??。

1 个答案:

答案 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);
        timeO​ut.start();
        helpe​r.start();
        return true;
    }
};