2016-04-06 9 views
0

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

В настоящий момент в моем журнале указано, что все значения повторяются. Однако на моем тестовом устройстве диаграмма не обновляется до самого конца; в этот момент все значения загружаются сразу, поэтому нет никакого эффекта «слайд-шоу».

Когда я хочу, чтобы начать воспроизведение значения в моей ArrayList, этот метод называется:

public void playback(){ 
    if(ret != null) { 
     for (int x = 0; x < ret.size(); x++) { 
      addEntry(ret.get(x)); 
      try { 
       Thread.sleep(100); 
      } catch (Exception e){ 
       //Do nothing 
      } 
     } 
    } else { 
     Log.d(LOG_TAG, "ret was null."); 
    } 
} 

Что я могу сделать так, что значения отображаются на моей карте, один за другим, с определенным количество времени между каждым значением?


Edit: Вот было решение, которое я в конечном итоге реализации с помощью от Shadab Ансари:

public void playback(){ 
    if(ret != null) { 
     addEntry(0); 
    } else { 
     Log.d(LOG_TAG, "ret was null."); 
    } 
} 



private void addEntry(int index) { 
    final int in = index; 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      yVals1.get(0).setVal(ret.get(in).intValue()); 
      RadarDataSet set1 = new RadarDataSet(yVals1, "Set 1"); 
      // And other UI stuff 

      // Recursive call! 
      if(in < ret.size() - 1){ 
       addEntry(in + 1); 
      } 
     } 
    }, 100); 

} 

В случае, если это не было ясно, RET была глобальная переменная, которая содержала массивы, которые я собирался вставить. yVals1 был ArrayList записей для заполнения радиолокационной карты.

Конечным результатом является то, что в этом примере код обновляется со следующим значением в моем ArrayList каждые 100 миллисекунд. За это время я все еще могу увеличить/уменьшить диаграмму и без проблем повернуть ее.

+0

Вы можете разместить код AddEntry()? –

ответ

0

Если ваш addEntry() выполняет операцию UI, то позвольте мне объяснить вашу проблему -

Объяснение -

Android это система, основанная на событие. Что-то происходит на устройстве (экран коснулся, нажата клавиша и т. Д.), И Android вызывает событие. Приложение уведомляется о событии, и когда возникает одно, что ему нужно реагировать на это, он часто запускает код, который вы написали. Ваше приложение запускает свой код в цикле под управлением операционных систем Android (OS). Этот цикл кода называется потоком выполнения приложения. Существует только один поток, и он отвечает за запуск кода приложения и обновление дисплея.

Таким образом, обновление пользовательского интерфейса происходит не сразу, и вы делаете поток потока пользовательского интерфейса в течение 100 мс каждый раз, когда цикл выполняется. И когда Android пытается обновить пользовательский интерфейс, вы делаете поток спящим, что означает, что в течение этого периода поток пользовательского интерфейса ничего не сделает. И это происходит до тех пор, пока ваша петля не закончится. После окончания цикла окончательное событие будет выполнено, и вы увидите, что ваш пользовательский интерфейс обновлен вызовом addEntry() с последним переданным значением.

Solution -

Вы можете использовать postDelayed() -

new Handler().postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          //Perform your task and it will be executed after 100 ms 
         } 
        },100); 
+0

Благодарим вас за рекомендации метода Handler и postDelayed! Я закончил тем, что использовал его с небольшими изменениями, и это сработало.Сначала я помещал содержимое моего метода addEntry внутри postDelayed, а затем запускал цикл, как обычно; это не совсем сработало, так как это означало, что все запуски addEntry будут запускаться сразу, но с любой миллисекундной задержкой, которую я дал в postDelayed. Я закончил тем, что метод рекурсивно вызывал следующий addEntry в конце выполнения. – ModWilliam