Java ME中的奇怪错误
我刚刚开始钻研JavaMe的奇迹,但在尝试创建线程时感到沮丧 下面是编译得非常好的代码。然而,一旦我在G600上安装并运行它,就会弹出“Java游戏错误” 我将其放入jar文件并安装的方法很有效,因为我创建了一个没有线程的游戏,效果很好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
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,因为他首先提出了一个仿真器的建议,后来又提出了一些有用的提示。