2014-06-27 125 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

我一直在測試,我一直無法找到一個特定的模式產生錯誤,它是如此不穩定,有時它發生在一個屏幕上,然後在另一個屏幕上,它不會總是發生。 難道是我內存不足? 檢查我的問題上的新編輯,我添加了輸出控制檯上的消息。 –