gpt4 book ai didi

user-interface - "pushModalScreen called by a non-event thread"在事件线程上抛出

转载 作者:行者123 更新时间:2023-12-04 06:43:32 25 4
gpt4 key购买 nike

我正在尝试让我的黑莓应用程序显示自定义模式对话框,并让打开的线程等待用户关闭对话框屏幕。

final Screen dialog = new FullScreen();

...// Fields are added to dialog

Application.getApplication().invokeAndWait(new Runnable()
{

public void run()
{
Application.getUiApplication().pushModalScreen(dialog);
}
});

尽管我正在使用 invokeAndWait 从事件线程调用 pushModalScreen,但它抛出了一个异常,显示“由非事件线程调用的 pushModalScreen”。

关于真正的问题是什么有什么想法吗?

这里是重现这个问题的代码:

package com.test;

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;

public class Application extends UiApplication {
public static void main(String[] args)
{
new Application();
}

private Application()
{
new Thread()
{
public void run()
{
Application.this.enterEventDispatcher();
}
}.start();

final Screen dialog = new FullScreen();
final ButtonField closeButton = new ButtonField("Close Dialog");
closeButton.setChangeListener(new FieldChangeListener()
{

public void fieldChanged(Field field, int context)
{
Application.getUiApplication().popScreen(dialog);
}
});
dialog.add(closeButton);
Application.getApplication().invokeAndWait(new Runnable()
{

public void run()
{
try
{
Application.getUiApplication().pushModalScreen(dialog);
}
catch (Exception e)
{
// To see the Exception in the debugger
throw new RuntimeException(e.getMessage());
}
}
});

System.exit(0);
}
}

我使用的是组件包版本 4.5.0。

最佳答案

基于 Max Gontar 的观察,即使用 invokeLater 而不是 invokeAndWait 时不会抛出异常,完整的解决方案是通过 invokeLater 和 Java 的同步方法正确实现 invokeAndWait:

public static void invokeAndWait(final Application application,
final Runnable runnable)
{
final Object syncEvent = new Object();
synchronized(syncEvent)
{
application.invokeLater(new Runnable()
{

public void run()
{
runnable.run();
synchronized(syncEvent)
{
syncEvent.notify();
}
}
});
try
{
syncEvent.wait();
}
catch (InterruptedException e)
{
// This should not happen
throw new RuntimeException(e.getMessage());
}
}
}

不幸的是,invokeAndWait 方法不能被覆盖,所以必须小心调用这个静态版本。

关于user-interface - "pushModalScreen called by a non-event thread"在事件线程上抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2525210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com