c# - 在 Java/J2ME 中与 UI 线程交互

标签 c# java multithreading java-me ui-thread

我正在编写 J2ME 应用程序。其中一个部分是定期轮询目录的内容,如果有任何新内容,则将它们绘制在屏幕上。我通过让 UI 表单启动一个带有指向自身的指针的轮询线程来完成此操作,并且当轮询线程发现某些内容时,它会回调表单并调用同步方法来更新它的显示。这似乎工作正常。

我的问题是这样的。在 C#/.NET 中,我知道让非 UI 线程更新 UI 并不好,处理这个问题的正确方法是将它委托(delegate)给 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 (worker thread) .

当 Swing 程序需要执行长时间运行的任务时,它通常会使用其中一个工作线程,也称为后台线程。

一个 Swing 程序包括以下几种线程:

  • 初始线程,执行初始应用程序代码的线程。
  • 事件调度线程,所有事件处理代码都在其中执行。大多数与 Swing 框架交互的代码也必须在此线程上执行。
  • 工作线程,也称为后台线程,执行耗时的后台任务。

Single-thread rule :
一旦实现了 Swing 组件,所有可能影响或依赖于该组件状态的代码都应该在事件调度线程中执行。

在J2EE上下文中使用时,需要注意的时候是referencing a SwingWorker from an EJB .

关于 J2ME ,这取决于您是将应用程序开发为可在任何支持 MIDP 的设备上运行的标准 MIDlet,还是例如作为 RIMlet,一种基于 CLDC 的应用程序,使用 BlackBerry-特定的 API,因此只能在 BlackBerry 设备上运行。

因为与 MIDP 的 UI 类不同,RIM 类似于 Swing,因为 UI 操作发生在事件线程上,这不像 MIDP 中那样是线程安全的。要在事件线程上运行代码,应用程序必须获得事件对象的锁,或使用 invokeLater() 或 invokeAndWait() – 开发人员需要额外工作,但复杂性是有代价的。

但对于 LCDUI , 你可以 access a form from multiple threads .

关于c# - 在 Java/J2ME 中与 UI 线程交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/292587/

相关文章:

c# - Async/Await 如何处理 "old"结果?

c# - 启动 RoboCode 时出错

c# - 电子邮件支持部分,用户地址为 "From address"

c# - 带有 Dispatcher 的 BackgroundWorker 似乎没有做任何事情

java - 我如何知道 Java 19 结构化并发 StructuredTaskScope 是否关闭(取消)?

swift - 如何在滚动时更新计时器上的 UITableView

c# - 解析 Json 数据字符串并检索特定元素

java - 在 Java 中嵌入 XQuery

java - Spring 3.2 对泛型类型的验证

c# - 多线程环境下 SendOrPostCallback 和 Action 的区别?