有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java ME中的多线程奇怪错误

我刚刚开始钻研JavaMe的奇迹,但在尝试创建线程时感到沮丧

下面是编译得非常好的代码。然而,一旦我在G600上安装并运行它,就会弹出“Java游戏错误”

我将其放入jar文件并安装的方法很有效,因为我创建了一个没有线程的游戏,效果很好

import java.util.Random;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;

public class CanvasTest extends MIDlet {
Display display;

public CanvasTest() {

}

public void startApp() {
  TestCanvas thecanvas = new TestCanvas();
  display = Display.getDisplay(this);
  display.setCurrent(thecanvas);
}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {}
}
class TestCanvas extends GameCanvas implements Runnable {
Font font;

int width;
int height;

boolean running = true;

public TestCanvas() {
    super(false);
    setFullScreenMode(true);
    width = getWidth();
    height = getHeight();
    Thread thisThread = new Thread(this);
    thisThread.start();

}
public void paint(Graphics g) {
    Random rand = new Random();
    g.setColor(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
    g.fillRect(0, 0, width, height);

}
public void run() {
  while(running) {
    paint(getGraphics());

    flushGraphics();

    try {
        Thread.sleep(50);
    } 
    catch(InterruptedException ex) {}
  }
}
};

注:是的,这不是游戏,它只是说明了我面临的问题

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    这只是一个猜测,但Java中的一条一般规则是,不能将UI“接触”到主线程之外。嗯,这有点粗略的解释,但是有很多关于这个主题的文章

    我建议您避免从单独的线程调用paint()flushGraphics()等UI方法

    我希望有帮助

  2. # 2 楼答案

    你们在打电话之前在模拟器上测试过吗?如果没有,为什么?如果是,情况如何

    关于代码,除了从构造函数创建和启动线程的两行代码之外,我觉得它还可以。我宁愿把这两行移到startApp的末尾

    public void startApp() {
        TestCanvas theCanvas= new TestCanvas();
        display = Display.getDisplay(this);
        display.setCurrent(theCanvas);
        new Thread(theCanvas).start(); // add here and...
    }
    //...
    public TestCanvas() {
        super(false);
        setFullScreenMode(true);
        width = getWidth();
        height = getHeight();
        // ...and remove here
        // Thread thisThread = new Thread(this);
        // thisThread.start();
    }