2

我正在开发一个应该移植到不同供应商手机上的 J2ME 应用程序。到目前为止,该应用程序运行良好,除了在摩托罗拉 V3 上(这是我尝试过的唯一一部摩托罗拉手机)。

问题是当我启动一个新线程时,当线程尝试更新图形(通过调用 repaint())时,图形系统是堆栈的。

一些有用的信息: - 我在 Midlet 的构造函数中获取显示,并在应用程序生命周期内重用它。- 只有一个类扩展 Canvas。每幅画都在这里发生。当我想要重新绘制图形时,我会从 UI 线程或另一个 Worker 线程调用 repaint() 方法。据我所知,每个线程都可以毫无问题地访问 UI。- 我尝试了一个修复,在应用程序的开头,我获取正在运行的(UI)线程的名称并将其存储以供以后使用。在调用 repaint() 之前,我检查当前线程的名称是否等于 UI 线程的名称。如果它颂歌,那么我做repaint(),否则我做:

display.callSerially(new Runnable() {
    public void run() {
        repaint();
    }
});

您能否指出摩托罗拉实施 J2ME 的任何细节?如何通过线程更新 UI 来解决这个问题?

谢谢,兹拉特科

4

1 回答 1

3

与 Swing 不同,MIDP 用户界面 API 是线程安全的。这意味着您不必使用 callSerially 来强制在 UI 线程上运行。有报道称 callSerially 在某些摩托罗拉设备上不能很好地工作,所以最好的办法是自己调用 repaint。

请注意,重绘只是对系统进行重绘的建议。如果你想强制重绘立即发生,你必须调用 serviceRepaints 方法。

可以在这里找到关于 MIDP UI 事件处理的一个很好的讨论。

于 2011-01-25T00:24:52.930 回答