2011-07-27 53 views
7

我有一個黑莓應用程序,當在一些仿真器與觸摸的支持(例如:9500,9520,9530,9550)上運行,終止與:BlackBerry:由於UiApplication.getUiApplication(),「應用程序沒有響應;進程終止」popScreen()?

「應用程序沒有響應;處理XPTO終止」

使用日誌,我發現它似乎像應用程序停止在一個類中,我通過異步HTTP請求:是這樣的:

public class LoadingFullScreen extends FullScreen implements Runnable { 

    private Thread actionThread = null; 

    protected void onDisplay() { 
     actionThread = new Thread(this); 
     actionThread.start(); 
    } 

    protected void onUndisplay() { 
     if(actionThread != null && actionThread.isAlive()) { 
      actionThread.interrupt(); 
     } 
    } 

    public void run() { 
     //make http requests - this is done successfully 

     synchronized(Application.getEventLock()) { 
       Screen active = UiApplication.getUiApplication().getActiveScreen(); 
       if (active instanceof LoadingFullScreen) { 
        Logger.debug("LoadingFullScreen popping screen"); //this appears in logs 
        UiApplication.getUiApplication().popScreen(active); 
        Logger.debug("LoadingFullScreen screen popped"); //this never appears in logs 
       } 
     } 
    } 
} 

我推出這個屏幕UiApplication.getUiApplication().pushModalScreen(new LoadingFullScreen())

在日誌中我可以看到:

[0.0] Wed Jul 27 17:53:06 GMT 2011 - DEBUG: LoadingFullScreen popping screen 
[0.0] JVM: bklt[1] @163148: JBSC on=0 
[0.0] JVM: bklt[1] @163148: SC 0 
[0.0] JVM: bklt[1]: setTimeout 30 
[0.0] Application XPTO(212) is not responding; process terminated 

好像UiApplication.getUiApplication().popScreen()阻止應用程序,所以OS殺死的應用,但是爲什麼呢?

編輯:
我一直在使用

UiApplication.getUiApplication().invokeLater(new Runnable() {...} };    

代替synchronized(Application.getEventLock()) {...}也試過,但我有相同的結果

編輯2:
我也嘗試過,而不是active.close()UiApplication.getUiApplication().popScreen(active);但我有完全相同的結果

編輯3: 使用javaloader我得到了這樣的堆棧跟蹤從仿真器:

guid:0x9C3CD62E3320B498 time: Thu Jul 28 15:02:50 2011 severity:0 type:3 app:Java Exception data: 
    ForcedStackTraceException 
    net_rim_services_impl(4) 27 2 0x1030B000 
    net_rim_os-3(4BEF0320) 
    HttpConnectionManager$CleanupThread 
    run 
    0x3B09 
guid:0x9C3CD62E3320B498 time: Thu Jul 28 15:02:50 2011 severity:0 type:3 app:Java Exception data: 
    ForcedStackTraceException 
    XPTO(247) 60 4 0x124A0400 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    getFocusRect 
    0x2A61 
    net_rim_cldc-12(4BEEF8A5) 
    Manager 
    getFocusRect 
    0x717 
    net_rim_cldc-12(4BEEF8A5) 
    Manager 
    getFocusRect 
    0x717 
    net_rim_cldc-12(4BEEF8A5) 
    Screen 
    getFocusRect 
    0x9AF2 
    net_rim_cldc-12(4BEEF8A5) 
    Screen 
    callOnExposed 
    0x9D16 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    <private> 
    0x9007 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    removeScreen 
    0x7D08 
    net_rim_cldc-12(4BEEF8A5) 
    Screen 
    close 
    0x6B66 
    XPTO-8(4E316B06) 
    LoadingFullScreen$1 
    run 
    0x34D5 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    dispatchInvokeLater 
    0x1A87 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    <private> 
    0x2809 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    processNextMessage 
    0x1AEF 
    net_rim_cldc-9(4BEEF8A5) 
    ModalEventThread 
    run 
    0xBE4F 
guid:0x9C3CD62E3320B498 time: Thu Jul 28 15:02:50 2011 severity:0 type:3 app:Java Exception data: 
    ForcedStackTraceException 
    XPTO(247) 30 2 0x139DA800 
    net_rim_cldc(4BEEF8A5) 
    Object 
    wait 
    0x9922 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    startModalEventThread 
    0x1EB8 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    addScreenModal 
    0x83F4 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    pushModalScreen 
    0x674E 
    net_rim_cldc-13(4BEEF8A5) 
    UiApplication 
    pushModalScreen 
    0x62B0 
    XPTO-8(4E316B06) 
    MyBaseScreen 
    <private> 
    0x3AA6 
    XPTO-8(4E316B06) 
    MyBaseScreen 
    openTheModalScreenFunction 
    0x382C 
    XPTO-8(4E316B06) 
    MyBaseScreen$4 
    fieldChanged 
    0x4271 
    net_rim_cldc-11(4BEEF8A5) 
    Field 
    fieldChangeNotify 
    0x160B 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    replace 
    0x7A5 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    inputMethodTextChanged 
    0x24E1 
    net_rim_cldc-15(4BEEF8A5) 
    PasswordEditField 
    inputMethodTextChanged 
    0x4F26 
    net_rim_cldc-27(4BEEF8A5) 
    IMContext 
    dispatchInputMethodEvent 
    0x1E00 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    sendComposedText 
    0x5CA1 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    sendComposedText 
    0x5BD1 
    net_rim_tid_fastEuropean(4BEF034C) 
    FastEuropeanInputMethod 
    sendComposedText 
    0x48E1 
    net_rim_tid_fastEuropean(4BEF034C) 
    FastEuropeanInputMethod 
    dispatchConversionEvent 
    0x43E3 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    dispatchKeyEvent 
    0x5309 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    dispatchEvent 
    0x63CA 
    net_rim_tid_fastEuropean(4BEF034C) 
    FastEuropeanInputMethod 
    dispatchEvent 
    0x426E 
    net_rim_cldc-27(4BEEF8A5) 
    InputContext 
    dispatchEvent 
    0x3E15 
    net_rim_cldc-27(4BEEF8A5) 
    IMContext 
    dispatchEvent 
    0x21DE 
    net_rim_cldc-11(4BEEF8A5) 
    Field 
    dispatchEvent 
    0x3739 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    dispatchEvent 
    0x30F6 
    net_rim_cldc-27(4BEEF8A5) 
    EventHandler 
    <private> 
    0x1460 
    net_rim_cldc-27(4BEEF8A5) 
    EventHandler 
    processKeyEvent 
    0x1A79 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    processKeyEvent 
    0x37F6 
    net_r 

編輯4: 我試圖在LoadingFullScreen移動run()方法到一個新的Runnable類,有人告訴我,當該課程顯示爲模態屏幕時,LoadingFullScreen implement Runnable可能會導致問題。
但是,我沒有運氣,我仍然有同樣的問題。
任何想法?

編輯5: 這裏解決:BlackBerry: "Application is not responding; process terminated" because of UiApplication.getUiApplication().popScreen()?

+0

您是否使用任何覆蓋「活動」,例如的OnClose()? –

+0

嗨雷。我重寫了顯示和onUndisplay。我正在編輯帖子,添加這些方法 – pandre

+0

我使用UiApplication.getUiApplication()。pushModalScreen(new LoadingFullScreen())啓動此屏幕,是否有任何影響? – pandre

回答

4

由於沒有一個答案解決這個問題,我在這裏張貼的解決方案,我與來自其他論壇的幫助(http://supportforums.blackberry.com/t5/Java-Development/Application-is-達到不響應的進程終止 - 因爲-的/ MP/1234573#M168285)

我沒有找到與之相關的,但似乎這樣我打電話LoadingFullScreen事項:

public void fieldChanged(Field field, int context) { 
    LoadingFullScreen loading = new LoadingFullScreen(); 
    System.out.println("calling pushModalScreen"); //this was showing up in logs 
    UiApplication.getUiApplication().pushModalScreen(loading); 
    System.out.println("pushModalScreen done"); //this wasn't showing up in logs  
} 

它事實證明我提到的模擬器/設備支持'SureType'。 「這意味着當你按下按鍵時,他們會做一些事情,通常他們會嘗試爲用戶顯示一個'選擇',因爲每個按鍵都有兩個選項,因爲你在FieldChanged方法中做了一個pushModal,阻止這一點,而我認爲這是令人不安的。「

因此,解決辦法是改變這種替代方式:

public void fieldChanged(Field field, int context) { 
    if (context != FieldChangeListener.PROGRAMMATIC) { 
     UiApplication.getUiApplication().invokeLater(new Runnable() { 
      public void run() { 
       LoadingFullScreen loading = new LoadingFullScreen(); 
       UiApplication.getUiApplication().pushModalScreen(loading);   
      } 
     } 
    } 
} 
4

我記得有一次我幾乎同樣的問題。每當我嘗試通過查看事件線程鎖來彈出屏幕時,應用程序都會崩潰。因此,不要讓事件線程保持(鎖定),嘗試使用invokeLater()在事件線程上同步。

UiApplication.getUiApplication().invokeLater(new Runnable() 
{ 
    public void run() 
    { 

    } 
}); 
+0

感謝您的答案。我嘗試過,但我有完全相同的問題。我編輯了原文,以反映 – pandre

+0

我的這個建議可能是錯誤的。我不擅長線程。但認爲這可能是問題看着你的代碼,我注意到你在UI類(FullScreen)上實現了Runnable。你使用** UiApplication.getUiApplication()pushModalScreen()**來推這個scree。因此,您現在正在加載EventScreen事件線程。當屏幕被推到顯示堆棧時,你創建一個新的線程,並將LoadFullSCreen運行在這個將執行run()的線程上。在此線程中,您嘗試創建此線程的popScreen。我懷疑這裏有一些問題。 – indusBull

+0

我建議創建一個實現Runnable的新類(類似ConnectNetwork)。剪切LoadigFullScreen的方法run()並將其粘貼到新類中。現在把這個新的可運行類放在線程上,它將像往常一樣創建。還有一件事,使用** onUiEngineAttached()**而不是onDisplay()和onUnDisplay()。後來的方法已從最近的操作系統中棄用。我希望這是問題所在。 – indusBull

1

假設不便是錯誤的(假設有一個RIM錯誤)與UiApplication.getUiApplication().popScreen()這裏只是一個想法嘗試:

而不是UiApplication.getUiApplication().popScreen(active);試圖調用active.close()

+0

嗨,感謝您的建議。但是,我得到完全相同的行爲。我編輯原帖以反映 – pandre

+0

嗯..我相信什麼MusiGenesis和你說。然而這對我來說是非常意外的。我已經在Storms上成功使用了'UiApplication.getUiApplication()。popScreen()'幾年了。可能應該有一些其他的條件(我的應用程序沒有)來顯示這個錯誤。或者也許這個bug顯示在一些特定的操作系統版本上。 –

0

我相信這是因爲創建的UI線程和ur線程無法正常通信。你可以使用下面的代碼。

UiApplication.getUiApplication().invokeLater(new Runnable() 
{ 
    public void run() 
    { 

    } 
}); 
+0

感謝您的提示,但正如我在第一次編輯中所說的那樣,我已經嘗試過了,它沒有工作 – pandre

0

我是有一個彈出式屏幕,我實施了類似奇怪的問題。事實證明,我有兩種不同的方法試圖同時彈出屏幕。這導致了錯誤。

我最終創建了一個靜態輔助方法,我現在用它來關閉我的屏幕,在關閉它之前檢查屏幕是否實際顯示。

這裏張貼在情況下,它可以幫助別人:類似這樣的

/** 
* Convenience method to request a screen to close & pop it from the display 
* stack. This method handles the UI threading issues. 
* 
* @param screen 
*  {@link Screen} to be closed. 
*/ 
public static void closeScreen(final Screen screen) 
{ 
    UiApplication.getUiApplication().invokeLater(new Runnable() 
    { 

     public void run() 
     { 
      if (screen.isDisplayed()) 
      { 
       screen.close(); 
      } 
     } 
    }); 
} 
0

我曾經歷過的東西。我有一個回調,其中處理髮生(從另一個線程調用),和通知經由Status處理的指示的用戶並使用這樣的代碼:

UiApplication.getUIApplication.invokeLater(new Runnable(){ 
    public void run(){ 
    Status.show("...."); 
    } 
}); 

而漸漸接近相同的誤差作爲OP。

我這時才意識到,因爲回調正在執行多次,ALL那些Runnable S的正在排隊,因此「太多線程」,其次是一個不錯的崩潰!

解決辦法:

UiApplication.getUIApplication.invokeAndWait(new Runnable(){ 
    public void run(){ 
    Status.show("...."); 
    } 
}); 

這將阻塞,直到事件隊列被清除更多Status製作方式顯示出來。

由於它的線程,它並不重要,因此一個很好的妥協。

最終結果:在事件日誌中不再有討厭的崩潰,也沒有虛假的消息。

對於OP:您可能不得不稍微重構如何通知最終用戶關於處理UI邏輯的通知以避免耗盡線程池。

順便說一句,應該指出 - 這是在BB 4.5 :)