我正在编写一个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框架?
关于Java,您所描述的内容看起来像SwingWorker(工作线程).
当Swing程序需要执行长时间运行的任务时,它通常使用一个工作线程,也称为后台线程.
Swing程序包括以下几种线程:
初始线程,执行初始应用程序代码的线程.
事件调度线程,执行所有事件处理代码.大多数与Swing框架交互的代码也必须在此线程上执行.
工作线程,也称为后台线程,执行耗时的后台任务.
单线程规则:
一旦实现了Swing组件,所有可能影响或依赖于该组件状态的代码都应该在事件派发线程中执行.
在J2EE上下文中使用时,在从EJB引用SwingWorker时需要小心.
关于J2ME,这取决于如果您正在开发应用程序,将任何支持MIDP的设备上运行,或标准的MIDlet 例如作为RIMlet,使用BlackBerry专用的API,因此只能在黑莓手机上运行一个基于CLDC的应用程序设备.
因为与MIDP的UI类不同,RIM类似于Swing,因为UI操作发生在事件线程上,这在MIDP中不是线程安全的.要在事件线程上运行代码,应用程序必须获取对事件对象的锁定,或使用invokeLater()或invokeAndWait() - 为开发人员提供额外的工作,但复杂性带有价格标签.
但是对于LCDUI,您可以从多个线程访问表单.