Странная ошибка в Java ME - PullRequest
1 голос
/ 26 июля 2011

Я только начинаю вникать в чудеса Java ME, но расстроился, пытаясь создать поток ...

Ниже приведен код, который компилируется абсолютно нормально. Однако, как только я устанавливаю его на свой 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 голос
/ 26 июля 2011

Просто дикая догадка, но общее правило в Java состоит в том, что вы не можете «дотронуться» до пользовательского интерфейса из основного потока. Ну, это немного грубо объяснено, но есть много статей на эту тему.

Я предлагаю вам не вызывать методы пользовательского интерфейса, такие как paint() или flushGraphics(), из отдельного потока.

Надеюсь, это поможет.

0 голосов
/ 26 июля 2011

ты тестировал его на эмуляторе до телефона?если нет - почему?если да - как все прошло?

в отношении кода он выглядит нормально для меня, за исключением скользких двух строк, где вы создаете и запускаете поток из конструктора.Я предпочел бы переместить эти две строки в конце 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();
}
...