我已经搜索过了,这些主题似乎都没有真正的帮助,我的问题是在PopupScreen上启动一个线程,等待它完成,然后用适当的通知关闭PopupScreen,下面是我的代码
LoginThread lt = new LoginThread(str1, str2);
lt.start();
synchronized(lt){
try{
lt.wait();
}catch(InterruptedException ie){
ie.printStackTrace();
}
//Everything works fine until here i add
close();
//Or
this.close();
}
private class LoginThread extends Thread{
public LoginThread(String str1, String str2){
}
public void run(){
synchronized(this){
notify();
}
}
}有什么建议我可以关闭这个弹幕吗?
发布于 2014-02-19 10:28:23
响应者应该意识到这是一个BlackBerry Java问题,在所提供的代码中可能并不清楚这一处理对BlackBerry Java的影响。
从BlackBerry的角度来看,显示PopupScreen的原因有很多,其中之一是在进行一些后台处理时锁定用户。但是,这种锁定从来没有使用thread.wait实现。BlackBerry Ui处理使用事件驱动的模型,因为我理解它有点像Swing (我不是Swing专家)。这样做的结果是,如果您试图编写等待代码,并且试图阻止用户继续前进,那么您必须等待事件线程,这将完全阻止用户输入。如果您尝试这样做的话,BlackBerry OS就会出现这种情况(除了在模拟器上,它有时会因为某种原因允许您这样做)。
有关这方面的更多信息,请参见此处:
什么是事件线程?
在这种情况下,用户希望在长时间运行的处理完成后关闭弹出屏幕。我建议使用类似于观察者模式的模式,换句话说,让线程在完成时回调观察者( PopupScreen)。观察者(屏幕)可以关闭自己。
同时,显示的屏幕(观察者)可以忽略通常会关闭它的事件,比如'Esc‘键。这个屏幕将显示一些对用户有用的东西,比如“请等待”。
不过,有一点要注意的是,回调将发生在后台线程上,但如果要执行Ui处理,则关闭必须在事件线程上。交换到事件线程上下文通常使用如下代码:
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
// put code in here
}
});这一切都说了,我再建议原来的海报搜索,因为我认为有很多这样的样本。在我所看到的样本中,没有人使用等待,所以我不太明白为什么OP一开始就尝试使用等待。如果在一个示例中看到了这一点,请(在评论中)指出它,以便我可以尝试修复它。
发布于 2014-02-19 09:47:39
在关闭自己之前,您可能必须释放所有的锁。将关闭移出同步范围。
此外,还应该将start()放在同步块中,否则线程可能会在到达wait()之前通知()。
https://stackoverflow.com/questions/21876494
复制相似问题