Обновление рассчитанных значений в макетах Android с помощью SeekBar - PullRequest
0 голосов
/ 01 декабря 2011

Итак, я работал над приложением, которое имеет модель Plan с несколькими различными входами и выходами, а макет приложения имеет элементы управления ползунком для входов и метки для выходов. Когда ввод изменяется, он обновляет модель, которая затем выполняет расчет, а затем обновляет представления. Сначала я не думал, что с этой архитектурой что-то не так, но даже простые вычисления, кажется, выполняются очень медленно, блокируя поток пользовательского интерфейса. Конечно, у меня есть несколько сложный способ обновления вещей:

  1. Ползунок (в подклассе группы просмотра) обновляет свое значение и отправляет сообщение делегату (который реализует интерфейс, специфичный для этого подкласса группы просмотра).
  2. Делегат (который содержит модель и контрольные подпредставления) говорит экземпляру плана установить новое значение, которое запускает план для пересчета его выходных данных.
  3. Как только план завершает свои расчеты, он отправляет делегату еще одно сообщение, которое затем указывает его выходным представлениям обновляться с новыми значениями.

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

Теперь я знаю, что Android значительно отличается от iOS, поэтому мне интересно, пойду ли я по этому поводу совершенно неправильно. Есть ли способ просто сказать этим представлениям наблюдать за моделью плана на предмет изменений и затем получить значение, которое должно отображаться?

Еще одна важная проблема, которую я вижу здесь, связана с вводом ползунка. Если я помещу вычисления обновления модели в поток, каждый раз, когда изменяется ползунок, будет создаваться новый поток. Эти потоки (как я видел) будут более или менее завершаться в случайном порядке, обновляя представление таким образом, что слишком мало смысла, когда вы должны увидеть постепенные изменения. Есть ли хороший способ выполнения многопоточных вычислений, которые должны изменяться с помощью панели поиска?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Вы смотрели на Наблюдатель и Наблюдаемый ?Возможно, ваша наблюдаемая модель может выполнить обновление, используя Runnable , а затем уведомить наблюдателя.

0 голосов
/ 01 декабря 2011

Это всего лишь представление о моей голове:

Вместо того, чтобы просто запускать новый поток для каждого обновления с помощью ползунка, вы можете реализовать что-то вроде Queue.

Для запуска Thread вам потребуется Queue.

public class QueueThread extends Thread {
  private boolean running;
  private ArrayDeque<Runnable> queue;
  private Thread current;

  public QueueThread() {
    running = true;
    queue = new ArrayDeque<Runnable>();
    current = new Thread();
  }

  @Override
  public void run() {
    while( running ) {
      if( !queue.isEmpty() && !current.isAlive() ) { //We only want to start a new thread if there is one or more in the queue AND the old task is not runnning.
        current = new Thread( queue.pollFirst() );
        current.start();
      }
      else
        try {
          Thread.sleep( 200 ); //We need a sleep in order to not hammer the CPU.
        }
        catch( InterruptedException e ) {
          e.printStackTrace();
        }
    }
  }

  public void stopThread() {
    running = false;
  }

  public void add( Runnable task ) {
    queue.addLast( task ); //Here is where we add a task to the queue. The slider (or whoever posts the updates) must have a reference to this thread object.
  }
}

. Это позволит завершить каждое обновление до запуска следующего.Я не уверен, как это будет в исполнении.Я не проверял это или что-нибудь.Это была просто идея.

...