Blackberry 黑莓应用程序失去焦点并导致应用程序冻结

Blackberry 黑莓应用程序失去焦点并导致应用程序冻结,blackberry,blackberry-eclipse-plugin,blackberry-jde,Blackberry,Blackberry Eclipse Plugin,Blackberry Jde,我正在从事的使用BlackBerry SDK 6的项目报告了一个错误,在该错误中,当关闭主屏幕时,会导致应用程序突然失去焦点并停止响应,控制台输出上报告的消息是前台应用程序*******失去焦点它没有屏幕。让我澄清一下,即使应用程序上的屏幕仍然可见,但应用程序不知何故失去了焦点,仍会显示此消息 我还不能确定触发这个错误的条件,我试着以许多主屏幕打开然后按下后退按钮关闭的情况为例。当我触发这个bug时,我会尝试更新一个更清晰的输出 在每个主屏幕上,onClose方法被重写以调用ScreenMana

我正在从事的使用BlackBerry SDK 6的项目报告了一个错误,在该错误中,当关闭主屏幕时,会导致应用程序突然失去焦点并停止响应,控制台输出上报告的消息是
前台应用程序*******失去焦点它没有屏幕
。让我澄清一下,即使应用程序上的屏幕仍然可见,但应用程序不知何故失去了焦点,仍会显示此消息

我还不能确定触发这个错误的条件,我试着以许多主屏幕打开然后按下后退按钮关闭的情况为例。当我触发这个bug时,我会尝试更新一个更清晰的输出

在每个主屏幕上,
onClose
方法被重写以调用ScreenManager类中的方法,我们创建该类是为了处理主屏幕的打开和关闭,其代码如下所示:

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();
    }
}
popPageStack的代码如下:

private void popPageStack() {
    pageStack.removeElementAt(pageStack.size()-1);
    UiApplication.getUiApplication().popScreen(UiApplication.getUiApplication().getActiveScreen());
}
有没有可能是在popScreen调用期间导致的?我刚开始在黑莓手机上开发,所以我不知道是否会出现一个弹出屏幕调用的情况,而在弹出屏幕之前的屏幕可以呈现一个应用程序上没有屏幕的情况

编辑

我制作了一个带有菜单项的测试项目,当单击该菜单项时,将删除正在显示的唯一屏幕,之后我前面描述的行为发生了。事实上,不知何故,我的屏幕已经用完了,最后一个显示的屏幕仍然是“显示”的,但由于已经弹出,因此无法进行交互

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

编辑2

尽管经过几次尝试,我还是能够复制这个bug两次。我得到的控制台输出如下:

[0.0]JVM:bklt@12347710:setTimer 30[0.0]UIE:Focus-目标丢失, prev=null,input=null,app=com.yallaya.rbt。Main@9b0462e2[0.0]UIE: 前台应用程序com.yallaya.rbt。Main@9b0462e2失去焦点是因为它 没有屏幕。[0.0]UIE:Focus-目标丢失,prev=null,input=null, app=com.yallaya.rbt。Main@9b0462e2[0.0]UIE:前台应用程序 com.yallaya.rbt。Main@9b0462e2因为没有屏幕而失去焦点。 [0.0]UIE:前台应用程序com.yallaya.rbt。Main@9b0462e2没有 屏幕。这应该得到纠正。[0.0]UIE:前台应用程序 com.yallaya.rbt。Main@9b0462e2忽略触摸屏触摸/单击,因为 它没有[0.0]目标屏幕。[0.0]JVM:bklt@12377703:timer[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

每次我尝试与屏幕交互(触摸或硬件输入),都会出现
[0.0]UIE:front app com.yallaya.rbt。Main@9b0462e2没有屏幕。这应该得到纠正。
行将显示

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

@Uriel Arvizu

因为我们必须在显示堆栈上至少有一个屏幕,所以按照惯例我们称之为父屏幕(不是一个概念),如果我们从显示堆栈中弹出这个屏幕,然后尝试运行任何操作,它将显示设备挂起或屏幕延迟

所以,当您实现popscreen方法时,我建议您在screen类(扩展mainscreen)上实现它,并向它提供“this”,它是screen的当前实例。。 您可以调用该方法在后退按钮上弹出一个屏幕,如下所示:

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;
            }
        }

在BB论坛上也有类似的问题:我一直在测试,但没有找到一个特定的模式来重现这个bug,它太不稳定了,有时它发生在一个屏幕上,然后又发生在另一个屏幕上,它并不总是发生。可能是我的内存不足吗?检查我的问题的新编辑,我添加了我在输出控制台上得到的消息。