使用SeekBar更新Android布局中的计算值

时间:2011-11-30 22:08:47

标签: java android android-layout seekbar android-input-method

所以,我一直在开发一个具有Plan模型的应用程序,该模型具有许多不同的输入和输出,并且应用程序的布局具有用于输出的输入和标签的滑块控件。当输入更改时,它会更新模型,然后运行计算,然后更新视图。我一开始并不认为这个体系结构有什么问题,但即使是简单的计算似乎运行起来也很慢,阻塞了UI线程。当然,我确实有一种更复杂的更新方式:

  1. Slider(在视图组子类中)更新其值并向委托发送消息(委托实现特定于该视图组子类的接口)。
  2. Delegate(包含模型和控制子视图)告诉Plan实例设置一个新值,触发计划重新计算其输出。
  3. 计划完成计算后,会向委托发送另一条消息,然后委托其输出视图使用新值进行更新。
  4. 我已经根据我开发的iOS应用程序对这个架构进行了建模,这个应用程序似乎没有运行计算的大问题。

    现在,我知道Android与iOS有很大的不同,所以我想知道我是否会完全错误。有没有办法告诉这些视图观察计划模型的变化,然后获取它应该显示的值?

    我在这里看到的另一个主要问题是滑块输入。如果我将模型更新计算放入线程中,则每次滑块更改时,都会创建一个新线程。这些线程(正如我所见)将或多或少地以随机顺序完成,以这样的方式更新视图,因为当您应该看到增量更改时也很有意义。是否有一种很好的方法可以使用搜索栏进行线程计算?

2 个答案:

答案 0 :(得分:1)

您是否看过ObserverObservable? 也许您观察到的模型可以使用Runnable执行更新,然后通知观察者。

答案 1 :(得分:0)

这只是我头脑中的一个想法:

您可以实现某种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.
  }
}

执行此操作将允许每个更新在下一个更新开始之前完成。我不确定它在性能方面会怎样做。我没有测试它或任何东西。这只是一个想法。