BlackBerry:由于UiApplication.getUiApplication()。popScreen(),“应用程序没有响应;进程终止”?

时间:2011-07-27 18:06:29

标签: blackberry blocking blackberry-simulator

我有一个Blackberry应用程序,当在一些带触摸支持的仿真器中运行时(例如:9500,9520,9530,9550),终止于:

“应用程序没有响应;进程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()正在阻止应用程序,因此操作系统会杀死应用程序,但为什么呢?

修改
我也尝试过使用

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: 我试图将run()中的LoadingFullScreen方法移到新的Runnable类,因为我被告知当该类显示为模态时,LoadingFullScreen implement Runnable会导致问题屏幕。
但是,我没有运气,我仍然有同样的问题 有什么想法吗?

编辑5: 解决了这里:BlackBerry: "Application is not responding; process terminated" because of UiApplication.getUiApplication().popScreen()?

6 个答案:

答案 0 :(得分:4)

我记得曾经有过几乎同样的问题。每当我尝试通过获取事件线程的锁定来弹出屏幕时,应用程序就会崩溃。因此,不要获取事件线程的保持(锁定),尝试使用invokeLater()在Event线程上进行同步。

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

   }  
});

答案 1 :(得分:4)

由于没有一个答案解决问题,我在这里发布了我在其他论坛的帮助下达成的解决方案(http://supportforums.blackberry.com/t5/Java-Development/Application-is-not-responding-过程终止-因为-的/ 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);          
            }
        }
    }
}

答案 2 :(得分:1)

假设smth错误(假设存在RIM错误)UiApplication.getUiApplication().popScreen(),这只是一个尝试的想法:

而不是UiApplication.getUiApplication().popScreen(active);尝试拨打active.close()

答案 3 :(得分:0)

我相信这是因为创建的ui线程和ur线程无法正常通信。您可以使用以下代码。

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

   }  
});

答案 4 :(得分: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();
            }
        }
    });
}

答案 5 :(得分:0)

我经历过类似的事情。我有一个回调(从另一个线程调用),其中处理发生,并通过Status通知用户处理的指示,并使用这样的代码:

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

与OP接近完全相同的错误。

我意识到,因为回调被多次执行,那些Runnable 所有 正在排队,因此“太多线程”然后是一场不错的撞车!

解决方案:

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

这将阻止直到事件队列被清除,让更多Status出现。

由于它在一个线程上,它无关紧要,因此是一个很好的妥协。

最终结果:事件日志中不再发生令人讨厌的崩溃事件和虚假消息。

OP:您可能需要稍微重新组织一下如何通知最终用户处理UI逻辑的通知,以免耗尽线程池。

顺便说一下,应该注意 - 这是在BB 4.5:)