2012-05-08 3 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, всегда помните эти два правила об одной модели потоков:

-Не блокировать нить пользовательского интерфейса,

-and Убедитесь, что вы открыли доступ к набору инструментов AndroidUI только на панели UI .

Я полагаю, что это линия вызывает у вас врезаться ...

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

Эта ссылка детализирует шаги для обновления пользовательского интерфейса в другом потоке:

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

0

Он пахнет дизайн проблема. Зачем вам запускать поток для анимации? С уважением, я думаю, вы должны запустить его в текущем потоке и использовать анимацию, основанную на времени. Вам почти не нужно менять свой код, поскольку он уже основан на времени.

+0

, как я мог это сделать, не подняв поток пользовательского интерфейса? я мог бы использовать обработчик, но тогда я не могу передать x и y ему – MikeT

+0

Я предполагаю, что ваша часть рендеринга вызывается каждые 1/x секунд? Затем просто создайте свой объект и в своей части рендеринга вызовите часть рендеринга вашего объекта взрыва. – tsug303

Смежные вопросы