invokeLater的run()方法被调用两次

时间:2013-03-31 11:03:12

标签: blackberry

为了确定我的BlackBerry应用程序中接下来要显示的屏幕,我正在使用下面的代码。但是,出于某些奇怪的原因,run()中的代码在通过屏幕点击选择菜单项时执行两次,而在使用手机的键盘时只执行一次。

任何可能导致此问题的想法?

protected boolean navigationClick(int status, int time)
{
    switch (mainMenu.getSelectedIndex())
    {
    case 0:
        UiApplication.getUiApplication().invokeLater(new Runnable()
        {
            public void run() 
            {
                UiApplication.getUiApplication().pushScreen(new PollListScreen());
            }
        });
        break;
    case 1:
        UiApplication.getUiApplication().invokeLater(new Runnable()
        {
            public void run() 
            {
                UiApplication.getUiApplication().pushScreen(new UpdateProfileScreen());
            }
        });
        break;

        // Etc.

    default:
        break;
    }
    return true;
}

1 个答案:

答案 0 :(得分:1)

我无法确切地看到哪里你已经放置了你正在展示的代码,但我认为这里不会出现太多问题。

如果多次调用run(),那么我认为多次调用navigationClick()

navigationClick()可以根据点击的来源(例如,触摸与拨轮)进行不同的调用。但是,您应该可以通过检查status参数对此进行排序。这样的事情可能适合你:

protected boolean navigationClick(int status, int time)
{
    if (status != 0)  // <-- NOTICE THIS CHECK!!!
    {
        switch (mainMenu.getSelectedIndex())
        {
            case 0:
            // your code cut out here for clarity
        }
    }
    return true;
}

如果您使用invokeAndWait(),则可能会阻止UI线程,这可能会导致第二次调用navigationClick()时出现问题。不过,这将使用两个错误来制作正确的。通常应该首选invokeLater()