Java ME中的奇怪错误

Java ME中的奇怪错误,java,multithreading,mobile,java-me,midlet,Java,Multithreading,Mobile,Java Me,Midlet,我刚刚开始钻研JavaMe的奇迹,但在尝试创建线程时感到沮丧 下面是编译得非常好的代码。然而,一旦我在G600上安装并运行它,就会弹出“Java游戏错误” 我将其放入jar文件并安装的方法很有效,因为我创建了一个没有线程的游戏,效果很好 import java.util.Random; import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; import javax.microedition.midle

我刚刚开始钻研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) {}
  }
}
};
注:是的,这不是游戏,它只是说明了我面临的问题


提前谢谢

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

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


我希望它能有所帮助。

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

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


我希望它能帮上忙。

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

关于代码,除了从构造函数创建和启动线程的两行代码外,我觉得它还可以。我宁愿将这两行移到
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();
}

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

关于代码,除了从构造函数创建和启动线程的两行代码外,我觉得它还可以。我宁愿将这两行移到
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();
}

我本以为显示器是.setCurrent(thecanvas);我会允许这个。。。无论如何,许多例子似乎都使用了这种方法,我认为display.setCurrent(thecanvas);我会允许这个。。。无论如何,许多例子似乎都使用了这种方法。建议并没有改变结果,事实上这是我的第一种方法,发布的代码是一种尝试(对此表示抱歉)。我会给你回复模拟器的运行情况。非常有趣-请在你得到更新后发布。另外,您是否测试/验证了确实发生了重新安装?我的意思是,如果在安装更新版本时出现了一些故障,那么您观察到的结果可能确实是以前的版本之一?我会检查一下,比如重新安装并启动“无线程”版本(您提到的一个运行良好),然后重新安装最新版本。或者更好的是,我会创建一个“启动屏幕”,首先显示并显示一些版本标识符。可能是一个简单的表单,带有textfield和一个命令‘Start’。好吧,这很尴尬,我得承认:我喜欢用‘手动’的方式做事——我使用的是compile+add-to-jar+adjust-jad等方法。。。事实证明,当使用SDK时,所有这些都可以在模拟器和手机上正常工作。我确实想找出我的错误,如果我真的发现哪里出了问题,我会发回这里。不过要归功于gnat,他首先提出了一个仿真器的建议,后来又提出了一些有用的提示。这个建议并没有改变结果,事实上,这是我的第一个方法,发布的代码是在尝试解决这个问题(很抱歉)。我会给你回复模拟器的运行情况。非常有趣-请在你得到更新后发布。另外,您是否测试/验证了确实发生了重新安装?我的意思是,如果在安装更新版本时出现了一些故障,那么您观察到的结果可能确实是以前的版本之一?我会检查一下,比如重新安装并启动“无线程”版本(您提到的一个运行良好),然后重新安装最新版本。或者更好的是,我会创建一个“启动屏幕”,首先显示并显示一些版本标识符。可能是一个简单的表单,带有textfield和一个命令‘Start’。好吧,这很尴尬,我得承认:我喜欢用‘手动’的方式做事——我使用的是compile+add-to-jar+adjust-jad等方法。。。事实证明,当使用SDK时,所有这些都可以在模拟器和手机上正常工作。我确实想找出我的错误,如果我真的发现哪里出了问题,我会发回这里。不过,这要归功于gnat,因为他首先提出了一个仿真器的建议,后来又提出了一些有用的提示。