当前位置: 首页 > 面试题库 >

与Java / J2ME中的UI线程进行交互

慕俊语
2023-03-14
问题内容

我正在编写一个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组件,所有可能影响或依赖于该组件状态的代码都应在事件分发线程中执行。

html" target="_blank">J2EE上下文中使用时,从EJB引用SwingWorker时需要小心。

关于 J2ME
,这取决于如果您正在开发的应用程序作为一个标准的MIDlet将任何支持MIDP的设备上运行,或 例如
作为RIMlet,使用BlackBerry专用的API,因此只能在黑莓手机上运行一个基于CLDC的应用程序设备。

因为与MIDP的UI类不同,所以RIM与Swing相似,因为UI操作发生在事件线程上,而事件线程不像MIDP那样是线程安全的。要在事件线程上运行代码,应用程序必须获得事件对象上的锁,或者使用invokeLater()或invokeAndWait()–开发人员需要付出额外的努力,但是复杂性带有价格标签。

但是对于LCDUI,您可以从多个线程访问表单。



 类似资料:
  • 问题内容: 在我阅读的问题中,我们建议在进程上使用线程,因为线程速度更快。我决定使用程序的线程来编辑Wikipedia中某个类别的文章。该程序获取要编辑的文章列表,然后将文章划分为10个线程。这样一来,我每分钟进行6-7次编辑,这与我没有使用线程的速度相同。当我启动程序的多个实例并为每个实例指定要处理的类别时,我看到每个进程每分钟可以进行6-7次编辑(我用5个进程进行了测试)。 为什么我的流程更快

  • 问题内容: 我正在阅读SašaJurić撰写的《行动中的长生不老药》,在第一章中说: Erlang进程彼此完全隔离。它们不共享内存,并且一个进程的崩溃不会导致其他进程的崩溃。 Java线程也不是真的吗?我的意思是,当Java线程崩溃时,它也不会崩溃其他线程- 尤其是,如果我们正在查看请求处理线程(请将该线程排除在此讨论之外) 问题答案: 在我之后重复: “这些是不同的范例” 大声说20次左右-这是

  • 问题内容: 有没有办法在非UI线程中进行UI更改?简短的问题。 问题答案: 如果您不想使用AsyncTask,请在您的主要活动中尝试使用带有内部类(ResponseHandler)的观察者模式,对不起,我无法正确设置格式,但是我确定您知道

  • 问题内容: 在PyCharm中,运行脚本后,它会自动将其杀死: C:\ Users \ Sean.virtualenvs \ Stanley \ Scripts \ python.exe C:/Users/Sean/PycharmProjects/Stanley/Stanley.py 流程结束,退出代码为0 脚本启动后如何与之交互?由于缺少更好的措辞方式,我该如何获取 脚本运行一次后提示? PyC

  • 问题内容: 我有一个大量的用C 编写的类库。我试图通过Swift内的某种桥接来利用它们,而不是将它们重写为Swift代码。主要动机是C 代码代表一个在多个平台上使用的核心库。实际上,我只是在创建一个基于Swift的UI,以允许核心功能在OS X下工作。 还有其他问题,“如何从Swift调用C 函数”。这 不是 我的问题。要桥接到C 函数,可以很好地进行以下操作: 通过“ C”定义桥接头 Swift

  • 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程。 操作系统会为这些进程分配一些执行资源,例如内存空间等。 在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。 我们都知道现代操作系统比如 Mac OS X,UNIX,Linux,Windows 等可以同时运行多个任务。 打个比方,你一边在用浏览器上网,一边在听敲代码,一边用 Markdow