2014-06-27 180 views
0

的项目我的工作,它使用黑莓SDK 6,报道了关闭一个MainScreen时,导致应用突然失去焦点,并停止响应的错误,该消息报道在控制台输出是foreground app ******* lost focus it has no screens。让我澄清,即使屏幕上的应用程序仍然可见,但显示此消息显示,但不知何故该应用程序失去了重点。黑莓应用程序失去焦点,并导致应用程序冻结

我一直没能查明这是触发这个bug的条件,我试图采取许多地方都MainScreens打开的情况下,然后我通过点击返回按钮关闭它们。当我触发这个错误时,我会尝试更新更清晰的输出。

在每一个MainScreen的onClose方法重载,调用我们的屏幕管理类中的方法,一类我们创建来处理我们的MainScreens的开启和关闭,它的代码如下所示:

pubic 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调用期间导致这种情况?我刚开始在黑莓开发,所以我不知道,如果其中popScreen调用制成,而一个POP操作前的画面被渲染的情况下可以在应用程序情况下没有屏幕是可能的?

编辑

我做了一个测试项目与菜单项,单击时,删除仅屏幕显示,我所描述的行为发生较早之后。事实上,我用某种方式耗尽了屏幕,显示的最后一张仍然“显示”,但由于已经弹出,所以不能进行交互。

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

EDIT 2

我能够重现错误的两倍,尽管多次尝试后。控制台输出我是这样的:

[0.0] JVM:BKLT @ 12347710:SetTimer的30 [0.0] UIE:焦点 - 目标丢失, 先前= NULL,输入= NULL,应用程式= com.yallaya。 [email protected] [0.0] UIE: 前景应用[email protected]失去焦点,因为它具有 没有屏幕。 [0.0] UIE:焦点 - 目标丢失,prev = null,input = null, [email protected] [0.0] UIE:Foreground app [email protected]失去焦点,因为它没有屏幕。 [0.0] UIE:前台应用程序[email protected]没有 屏幕。这应该被纠正。 [0.0] UIE:前景应用 [email protected]忽略触摸屏触摸/点击,因为 它没有[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上= 1 [0.0] JVM:BKLT [1] @ 12388023:SC 1 [0.0] JVM:BKLT @ 12388023:SetTimer的30

每次我试图与屏幕(或者触摸或硬件交互作用输入),[0.0] UIE: Foreground app [email protected] has no screens. This should be corrected.行会显示。

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

+0

类似的问题在BB论坛上被问到:http://supportforums.blackberry.com/t5/Java-Development/App-freezes-when-closing-a-MainScreen-loses-focus-and-says-it/td-p/ 2918548 –

回答

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

我一直在测试,我一直无法找到一个特定的模式产生错误,它是如此不稳定,有时它发生在一个屏幕上,然后在另一个屏幕上,它不会总是发生。 难道是我内存不足? 检查我的问题上的新编辑,我添加了输出控制台上的消息。 –