2012-05-08 41 views
1

嗨每次在我的遊戲中有東西被破壞後,我創建了一個爆炸動畫的新對象,通過在我的表面視圖線程中使用線程類來完成。在短時間內摧毀多艘船後,應用程序退出該活動。爲什麼是這樣?Android - 多線程導致應用程序崩潰

explosion ex = new explosion(x,y); 
ex.start(); 

class explosion extends Thread implements Runnable{ 

    private long startTime; 
    private int num = 0; 
    private int x; 
    private int y; 
    public explosion(int mx, int my){ 
     x = mx; 
     y = my; 
     startTime = System.currentTimeMillis(); 
    } 
    public void run(){ 
     while(num < 3){ 
      long millis = System.currentTimeMillis(); 
      canvas.drawBitmap(explosions.get(num),x,y,null); 
      if(millis - startTime > 50){ 
       startTime = System.currentTimeMillis(); 
       num++; 
       Log.d("Explosion","Animate"); 
      } 
     } 
     Log.d("Explosion","End Thread"); 
    } 
}; 
+0

我相信編輯另一個線程上的用戶界面是nono –

+0

如果你提供了一些日誌消息 – Melllvar

+0

沒有日誌消息 – MikeT

回答

2

從developer.android複製...

不管你是否不使用的AsyncTask,永遠記住關於單線程模型中,這些 兩個規則:

- 不阻止UI線程,

- 確保您只在UI 線程上訪問AndroidUI工具包。

我相信這條線是造成你崩潰...

canvas.drawBitmap(explosions.get(num),x,y,null); 

此鏈接詳細介紹了步驟在另一個線程更新UI:

http://developer.android.com/resources/articles/painless-threading.html

0

它聞起來像設計問題。你爲什麼要爲動畫運行一個線程? 在適當的方面,我認爲你應該在當前線程中運行它並使用基於時間的動畫。您幾乎不需要更改代碼,因爲它已經基於時間。

+0

我怎麼能做到這一點,而不用阻止UI線程?我可以使用處理程序,但然後我不能通過x和y它 – MikeT

+0

我假設你的渲染部分每1秒x秒被調用?然後創建你的對象,並在渲染部分調用爆炸對象的渲染部分。 – tsug303