1

为了确定接下来在我的 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;
}
4

1 回答 1

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()通常应该是首选。

于 2013-04-01T08:07:23.070 回答