BlackBerry应用程序失去焦点并导致应用冻结

时间:2014-06-27 18:29:39

标签: blackberry blackberry-eclipse-plugin blackberry-jde

我正在使用BlackBerry SDK 6的项目报告了一个错误,当关闭MainScreen导致应用突然失去焦点并停止响应时,控制台输出上报告的消息为{{1} }。让我澄清一下,即使应用程序上的屏幕仍然可见,但该应用程序的屏幕仍然可见,但此消息仍然显示。

我无法确定触发此错误的条件是什么,我试图采用打开许多MainScreens然后按后退按钮关闭它们的情况。当我触发这个错误时,我会尝试使用更清晰的输出进行更新。

在每个MainScreen上,覆盖foreground app ******* lost focus it has no screens方法以调用我们的ScreenManager类中的方法,这是我们创建的用于处理MainScreens打开和关闭的类,其代码如下所示:

onClose

popPageStack的代码是:

public void back()
{
    if(pageStack.size() - 1 == 0) {
        // if only one screen is in our stack collection, show a prompt asking if user wants to close app
        int choose=Dialog.ask(Dialog.D_YES_NO, ui.getRb().getString(ui.EXIT_YES_NO));
        if(choose==Dialog.YES)
        {
            System.exit(0);
        }
    }  else {
        // in case our stack of screens has more than one screen remaining then pop it for our stack
        popPageStack();
    }
}

在popScreen调用期间是否可能导致此问题?我刚刚开始在BlackBerry上进行开发,所以我不知道是否出现了popScreen调用的情况,并且在渲染一个poped之前的屏幕是否可能没有应用程序上的屏幕情况下是可能的?

修改

我创建了一个带有菜单项的测试项目,当单击该项目时,删除了显示的唯一屏幕,之后我描述的行为发生了。实际上,我以某种方式耗尽了屏幕,显示的最后一个仍显示“显示”,但由于它已经弹出,因此无法进行任何交互。

我正在检查我的原始项目但我不明白当我只是使用后退按钮向后移动时如何触发onClose调用。无论如何,如果我要到达最后一个窗口,则会弹出一个对话框,询问应用程序是否应该关闭。

编辑2

虽然经过多次尝试,但我能够重复两次这个bug。我得到的控制台输出是:

  

[0.0] JVM:bklt @ 12347710:setTimer 30 [0.0] UIE:焦点 - 目标丢失,   prev = null,input = null,app = com.yallaya.rbt.Main @ 9b0462e2 [0.0] UIE:   前景app com.yallaya.rbt.Main@9b0462e2失去了关注,因为它有   没有屏幕。 [0.0] UIE:焦点 - 目标丢失,prev = null,输入= null,   app = com.yallaya.rbt.Main@9b0462e2 [0.0] UIE:前景app   com.yallaya.rbt.Main@9b0462e2失去焦点,因为它没有屏幕。   [0.0] UIE:前景app com.yallaya.rbt.Main@9b0462e2没有   屏幕。这应该得到纠正。 [0.0] UIE:前景app   com.yallaya.rbt.Main@9b0462e2忽略触摸屏触摸/点击因为   它没有[0.0]目标屏幕。 [0.0] JVM:bklt @ 12377703:计时器[0.0]   JVM:bklt [1] @ 12377703:usrIdle 27,usrTime 30,usrAct 1 [0.0] JVM:   bklt [1] @ 12377703:chkIdle 29,currTime 30 [0.0] JVM:bklt @ 12377703:   setTimer 3 [0.0] JVM:bklt @ 12380734:timer [0.0] JVM:bklt [1]   @ 12380734:usrIdle 30,usrTime 30,usrAct 1 [0.0] JVM:bklt [1]   @ 12380734:chkIdle 33,currTime 30 [0.0] JVM:bklt [1] @ 12380734:   enableBacklight 0 [0.0] JVM:bklt [1]:setTimeout 30 [0.0] JVM:bklt [1]   @ 12386796:JBSC on = 0 [0.0] JVM:bklt [1] @ 12386796:SC 0 [0.0] JVM:   bklt [1]:setTimeout 30 [0.0] JVM:bklt [1] @ 12388023:JBSC on = 1 [0.0]   JVM:bklt [1] @ 12388023:SC 1 [0.0] JVM:bklt @ 12388023:setTimer 30

每当我尝试与屏幕交互(触摸或硬件输入)时,private void popPageStack() { pageStack.removeElementAt(pageStack.size()-1); UiApplication.getUiApplication().popScreen(UiApplication.getUiApplication().getActiveScreen()); } 行都会显示。

这是否暗示我的问题在哪里?

1 个答案:

答案 0 :(得分:0)

@Uriel Arvizu

由于我们必须在显示堆栈上至少有一个屏幕,如果我们从显示堆栈中弹出此屏幕并尝试运行任何内容,它将显示设备挂起或显示,我们按照惯例(不是概念)将其称为父屏幕屏幕滞后...

所以当你实现popscreen方法时,我建议你在你的屏幕类(扩展主屏幕)上实现它并向它提供“this”,这是屏幕的当前实例。 你可以调用方法在后退按钮上弹出一个屏幕点击:

ButtonField buttonBack = new ButtonField(new StringProvider("Back"));

buttonBack.setChangeListener(new FieldChangeListener() {
    public void fieldChanged(Field field, int context) {
       closeThisScreen();
    }
});

在同一课程中关闭此画面的方法

void closeThisScreen() {
    UiApplication.getUiApplication().popScreen(this);
}

当显示主屏幕并且用户按下后退按钮显示消息然后在主屏幕上关闭应用程序

public boolean onClose()
        {
            int response = Dialog.ask(Dialog.D_YES_NO,"Are you sure you want exit?");
            if (response == -1)
            {
                return false;
            }
            else
            {
                System.exit(0);
                return true;
            }
        }