如何解决与Java / J2ME中的UI线程进行交互
关于Java,您所描述的内容看起来像是SwingWorker(工作线程)。
当Swing程序需要执行长时间运行的任务时,它通常使用辅助线程之一,也称为后台线程。
Swing程序包括以下类型的线程:
- 初始线程,即执行初始应用程序代码的线程。
- 事件分派线程,在其中执行所有事件处理代码。与Swing框架进行交互的大多数代码也必须在此线程上执行。
- 工作线程,也称为后台线程,在其中执行耗时的后台任务。
单线程规则: 一旦实现了Swing组件,所有可能影响或依赖于该组件状态的代码都应在事件分发线程中执行。
在J2EE上下文中使用时,从EJB引用SwingWorker时需要小心。
关于 ,这取决于如果您正在开发的应用程序作为一个标准的MIDlet将任何支持MIDP的设备上运行,或 作为RIMlet,使用BlackBerry专用的API,因此只能在黑莓手机上运行一个基于CLDC的应用程序设备。
因为与MIDP的UI类不同,所以RIM与Swing相似,因为UI操作发生在事件线程上,而事件线程不像MIDP那样是线程安全的。要在事件线程上运行代码,应用程序必须获得事件对象上的锁,或者使用invokeLater()或invokeAndWait()–开发人员需要付出额外的努力,但是复杂性带有价格标签。
解决方法
我正在编写一个J2ME应用程序。其中一项功能是定期轮询目录的内容,如果有任何新内容,请将其绘制在屏幕上。我通过让UI表单启动一个带有指向自身的指针的轮询线程来完成此操作,并且当轮询线程找到某些内容时,它将回调该表单并调用syncrhonized方法来更新其显示。这似乎很好。
我的问题是这个。在C#/。NET中,我知道让非UI线程更新UI并不是一件好事,而处理此问题的正确方法是将其委派给UI线程。
例如以下内容:
public void DoSomeUIThing()
{
if (this.uiComponent.InvokeRequired)
{
this.uiComponent.Invoke(someDelegateThatCallsBackToThis);
}
else
{
this.uiComponent.Text = "This is the update I want to happen";
}
}
是否有等效的J2ME来管理此过程?Java呢?还是Java / J2ME在这方面玩得更好?如果没有,该怎么做?
[编辑]似乎Swing通过SwingUtilities.invokeLater()和invokeAndWait()方法支持了我要问的问题。J2ME是否有一个等效的框架?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。