2015-08-30 2 views
0

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

int m=2; 
    while (bigList.get(m).type !=1) { 
     final int n=m; 
     new Handler().postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       smallList.add(n, bigList.get(n)); 
       adapter.notifyDataSetChanged(); 
      } 
     }, bigList.get(n).delay); 
     m++; 
    } 

Но задерживается только в первый раз, а затем обновляются все сразу, но я думал, что задержка будет на протяжении всех этапов в в то время как. Я пытался убить/закрыть/финализировать (для этого существует только последний) анонимный Runnable, но эффекта не было. Как сделать эту задержку на каждом , а шаг? Может быть, использовать некоторые другие конструкции или что лучше?

ответ

0

Я не пробовал это, но я предполагаю, что проблема в том, что ваш обработчик предназначен для основного потока, а ваш код, который отправляется этому обработчику, также находится в основном потоке.

Итак, цикл «while» блокирует поток, и сообщения накапливаются в очереди обработчика. Затем, когда цикл выходит, все сообщения обрабатываются.

Чтобы получить то, что вы ожидаете, вам, вероятно, нужно запустить цикл «while» в фоновом потоке и по-прежнему отправлять сообщения в основной поток.

См. Running code in main thread from another thread для получения информации о том, как это сделать.

+0

Спасибо за совет, я попытаюсь прояснить себе, как это сделать с вашей ссылкой. Но я нашел точную проблему - postDelayed тяжелее, чем что-то еще в «while», поэтому он сначала добавляет все временные элементы и только после этого заменяет его (так что m ++ происходит раньше, чем часть Handler) –

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