Android: эффективен ли цикл while? - PullRequest
2 голосов
/ 14 апреля 2011

В настоящее время я использую следующую конструкцию:

while(continue)
{
    if(somethingChanged)
    {
        draw();
    }
}

Эффективен ли этот способ ожидания или есть лучший способ сделать это?

-

По запросу, дополнительная информация:

Я рисую на SurfaceView, где Thread блокирует Canvas и вызывает метод onDraw (Canvas). Когда то, что я нарисовал, не изменилось, мне не нужно вызывать метод onDraw (Canvas), поэтому я сохраняю логическое значение кое-чтоChanged.

Кроме того, когда я касаюсь экрана, я рисую, скажем, кружок в точке касания, поэтому, когда я касаюсь экрана, что-то изменилось.

Ответы [ 5 ]

3 голосов
/ 14 апреля 2011

Вы также можете использовать wait() и сделать другие потоки notify() такими, когда что-то изменилось (если что-то изменилось в других потоках).

2 голосов
/ 14 апреля 2011

Android имеет лучший механизм относительно циклов бездействия, чем подход std java. Он состоит из Looper и Handler, которые делают всю работу за вас:

Handler myHandler;
...
public void run() { 

       Looper.prepare(); //this tells Android that your thread will contain a loop

       myHandler = new Handler() {

              public void handleMessage(Message msg) {
                      draw();  
              }
       };
Looper.loop; //starts the loop
}

Все, что вам нужно сделать, чтобы вызвать метод draw, это отправить сообщение этому обработчику вместо установки логического значения var.

Message mess;
myHandler.sendMessage(mess)

Таким образом, вы также можете отправить любой объект в этом сообщении в цикл, и android сделает синхронизацию потока и очередь сообщений за вас. И - самое главное - это тоже эффективно.

2 голосов
/ 14 апреля 2011

Вы, вероятно, делаете игру, я рекомендую эту статью: http://dewitters.koonsolo.com/gameloop.html Есть очень хорошие возможные решения для вашего запроса.

1 голос
/ 14 апреля 2011

Обычно в бесконечных циклах у вас должен быть какой-то механизм, чтобы он не занимал все время процессора. Это делается, например, с помощью сна. Даже краткий сон облегчит использование процессора. Предполагая, что этот код находится в потоке:

while(continue)
{
    if(somethingChanged)
    {
        draw();
    }
    Thread.sleep( mySleepTime );
}
1 голос
/ 14 апреля 2011

Если ничего не изменилось, это бесконечный цикл, который, скорее всего, будет использовать 100% ЦП, поэтому я бы сказал, что вы должны хотя бы добавить несколько вызовов Thread.sleep(), чтобы дать другим потокам возможность что-то сделать (например, изменить значение somethingChanged)

...