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