Подождите, выдает ошибку в Android - PullRequest
0 голосов
/ 20 января 2011

Мой проект - это, где мне нужно подождать, пока завершится фоновая операция. До этого отображается диалоговое окно прогресса. Теперь, после завершения операции, результаты сохраняются в списке, и список должен быть создан.

Кажется, что все работает нормально (диалог прогресса и все), но в wait () мой код (при переполнении стека) имеет значение

    Runnable runnable = new Runnable() {
    public void run() {
      // wait(); This call wouldn't work
      synchronized (this) {
        wait();  // This call will work
      }
    }
};

и после завершения фоновой операции это

public void handleMessage(android.os.Message msg) {
          super.handleMessage(msg);
             System.out.println("Doneee!!! Yup yes ");
          pd.dismiss();
         synchronized (runnable) {
        runnable.notifyAll(); // this call will work
       }
    }

Но проблема в том, что ожидание зависает. Я имею в виду, когда я пытался также отладить, wait () не возвращается. Это только в состоянии ожидания. Так что вы можете помочь мне сделать это!

Заранее большое спасибо!

С уважением Nithin

Ответы [ 2 ]

0 голосов
/ 06 апреля 2012

Ожидания должны быть синхронизированы, чтобы избежать именно той проблемы, которую вы видите.Решением вашей проблемы является использование флага, а также вызовов wait () и notify ().Синхронизация для ожидания завершения операции должна выглядеть примерно так:

boolean done = false;

...

synchronized(this) {
   if (!done) wait();
}

...
synchronized(this) {
   done = true;
   notifyAll();
}

Если у вас нет флага, тогда возможно, что notifyAll () будет вызываться до wait() есть, в какой момент вы в конечном итоге ждать вечно.Синхронизированные блоки необходимы для того, чтобы уведомление не происходило между выполнением проверки и вызовом wait ().Причина, по которой Java-объекты отсутствуют, заключается в том, что разработчики языка пытаются слегка напомнить вам, что такой тип системы обычно необходим.

Отредактировано, чтобы добавить: В Android для большинства целей класс AsyncTaskснимает с себя все хлопоты от подобных вещей.Используйте его, когда это возможно.

0 голосов
/ 20 января 2011

Если вы отображаете диалог прогресса, то; надеюсь, вы отправляете уведомление о прогрессе из фонового процесса в диалоговое окно прогресса, так что «диалоговое окно прогресса» не является «я тупой, поэтому я не буду отображать диалог прогресса» Пусть фоновый процесс отправит уведомление «Я закончил».

...