2012-05-03 2 views
1

Привет, я разрабатываю приложение для Android и им интересно, как я делаю приложение использовать меньше процессора во время фонового рисунка. Например, мое приложение останавливается, когда он теряет фокус, но использование процессора еще 50%Правильная многозадачность для android

Редактировать

while (!pause) { 
      Canvas c = null; 
      try { 
       c = sHolder.lockCanvas(null); 
       synchronized (sHolder) { 
        doDraw(c); 
        powerUps(); 
       } 
      } finally { 
       if (c != null) { 
        sHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 

Затем, когда вы делаете паузу и возобновить его только изменяет переменные паузы

+0

Похоже, у вас есть активное ожидание, что это спиннинг и ест процессора. – JesusFreke

+2

Можем ли мы увидеть код того, что вы делаете, когда останавливаетесь? – momo

+0

отредактировал мой комментарий – MikeT

ответ

2

ИМ, вы должны не выполняйте цикл, пока ваше приложение приостановлено.

Для получения более подробной информации о «правильном» жизненном цикле приложения для Android обратитесь к this page.

Также обратите внимание, что при любом занятом контуре вашего приложения будет использоваться 100% процессора - я не уверен, правильно ли запущен цикл из метода onResume(); мой инстинкт состоит в том, чтобы каждая итерация вашего цикла выполнялась отдельным вызовом, инициированным вызовом Handler.post(), при этом последний оператор повторно отправлял следующий вызов. В противном случае основной поток приложения будет голоден, не так ли?

Может быть что-то вроде этого:

void iterate() { 
    Canvas c = null; 
    try { 
     c = sHolder.lockCanvas(null); 
     synchronized (sHolder) { 
      doDraw(c); 
      powerUps(); 
     } 
    } finally { 
     if (c != null) { 
      sHolder.unlockCanvasAndPost(c); 
     } 
    } 
    this.handler.post(this.iterateRunnable); 
} 

void onResume() { 
    this.handler = new Handler(); 
    this.iterateRunnable = new Runnable() { 
     @Override public void run() { iterate(); } 
    }; 
    this.handler.post(this.iterateRunnable); 
} 
+0

ohhhh, а затем onPause() вы просто удалили обратные вызовы для обработчика? – MikeT

+0

на самом деле ждать, когда мой класс использует runnable, и как бы реализовать этот метод usingth run() – MikeT

+0

Я имел в виду «Runnable» вместо «Runner». Я упоминал, что я не тестировал это? И да - 'this.handler.removeCallbacks (this.iterateRunnable);' должно выполняться в 'onPause()'. –

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