Java ME中的奇怪错误

时间:2011-07-26 17:55:15

标签: java multithreading mobile java-me midlet

我刚刚开始深入研究Java ME的奇迹,但在尝试创建线程时却感到沮丧......

以下是编译绝对精细的代码。但是,只要我在G600上安装并运行它,就会弹出“Java Game Error”。

我把它放在一个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 个答案:

答案 0 :(得分:1)

只是一个疯狂的猜测,但Java中的一般规则是你无法从主线程中“触摸”UI。好吧,这有点粗略解释,但有很多关于这个主题的文章。

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

我希望它有所帮助。

答案 1 :(得分:0)

你在手机之前在模拟器上测试了吗?如果不是 - 为什么?如果是的话 - 它是怎么回事?

关于代码它看起来不错,除了 slippery 两行,你从构造函数创建和启动线程。我宁愿在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();
}