2011-07-26 128 views
1

我剛開始鑽研的Java ME的奇蹟,但試圖創建一個線程時已經變得沮喪......奇怪的錯誤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) {} 
    } 
} 
}; 

注:是的,這不是遊戲,它只是表明我面臨的問題。

在此先感謝!

回答

0

您是否在電話之前在模擬器上測試過它?如果不是 - 爲什麼?如果是的話 - 它是怎麼回事?

關於代碼,它看起來對我來說除了兩行你創建並從構造函數啓動線程。我寧願在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(); 
} 
+0

建議並沒有改變結果,實際上這是我的第一種方法,並且發佈的代碼是一個嘗試在工作(對此感到遺憾) 。 我會回覆你的模擬器票價。 – Thomas

+0

非常有趣 - 請在發佈更新時發佈。此外,您是否以某種方式測試/驗證確實發生了重新安裝?我的意思是,如果安裝更新版本時出現故障,那麼您觀察到的結果可能確實是以前的版本之一?我會用重新安裝和啓動「無線」版本(你提到的一個工作正常)來重新檢查,然後重新安裝最新的版本。或者更好,我會創建一個「啓動畫面」,首先顯示並顯示一些版本標識符。可能是一個帶有textfield和命令的簡單表單'Start' – gnat

+0

嗯,這是令人尷尬的,我有一個坦白的說法:我喜歡做'手動'的方式 - 我正在使用編譯+添加到jar +調整jad, etc方法......結果是,在使用SDK時,在模擬器和手機中都可以很好地工作。 我的確打算髮現我的錯誤,如果我確實發現了什麼地方出了問題,我會回到這裏。 儘管如此,他還是首先提出了一個模擬器的建議,然後提供了一些有用的技巧。 – Thomas

1

只是一個瘋狂的猜測,但在Java中的一個通用規則是,你不能「觸摸」UI的主線程。嗯,這有點粗略的解釋,但有很多關於這個話題的文章。

我建議你避免從單獨的線程調用UI方法,如paint()flushGraphics()

我希望它有幫助。

+0

年底移動這兩條線,我會以爲 display.setCurrent(thecanvas); 將允許這... 無論如何,許多例子似乎使用這種方法 – Thomas