【问题标题】:BlackBerry app loses focus and causes app to freeze黑莓应用程序失去焦点并导致应用程序冻结
【发布时间】:2014-06-27 18:29:39
【问题描述】:

我正在处理的使用 BlackBerry SDK 6 的项目报告了一个错误,在该错误中,当关闭 MainScreen 导致应用程序突然失去焦点并停止响应时,控制台输出报告的消息为 foreground app ******* lost focus it has no screens。让我澄清一下,即使应用程序上的屏幕仍然可见但应用程序以某种方式失去焦点,也会显示此消息。

我无法确定触发此错误的条件,我尝试以打开许多 MainScreen 然后按返回按钮关闭它们的情况为例。当我触发这个错误时,我会尝试用更清晰的输出进行更新。

在每个 MainScreen 上,onClose 方法被重写以调用 ScreenManager 类中的一个方法,我们创建一个类来处理 MainScreens 的打开和关闭,它的代码如下所示:

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 调用期间造成这种情况的原因?我刚刚开始在 BlackBerry 上进行开发,所以我不知道是否会发生 popScreen 调用以及在渲染弹出之前的屏幕时是否可能出现 no screen on app 的情况?

编辑

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

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

编辑 2

尽管经过几次尝试,我还是能够重现该错误两次。我得到的控制台输出是这样的:

[0.0] JVM:bklt @12347710:setTimer 30 [0.0] UIE:焦点 - 目标丢失, 上一页=null,输入=null,app=com.yallaya.rbt.Main@9b0462e2 [0.0] UIE: 前台应用程序 com.yallaya.rbt.Main@9b0462e2 失去焦点,因为它有 没有屏幕。 [0.0] UIE:焦点 - 目标丢失,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:计时器 [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:计时器 [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: Foreground app com.yallaya.rbt.Main@9b0462e2 has no screens. This should be corrected. 行。

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

【问题讨论】:

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


【解决方案1】:

@Uriel Arvizu

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

所以当你实现 popscreen 方法时,我建议你在你的屏幕类(它正在扩展 mainscreen)上实现它,并向它提供“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;
            }
        }

【讨论】:

  • 我一直在测试,但我无法找到重现该错误的特定模式,它非常不稳定,有时它会在一个屏幕上发生,然后在另一个屏幕上发生,它不会总是发生。会不会是我内存不够了?检查我的问题的新编辑,我添加了在输出控制台上收到的消息。
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多