使用搜索栏更新Android布局中的计算值



所以,我一直在一个应用程序,有一个计划模型与许多不同的输入和输出,和应用程序的布局有滑块控件的输入和标签的输出。当输入发生变化时,它会更新模型,然后运行计算,然后更新视图。起初我并不认为这种架构有什么问题,但即使是简单的计算似乎也运行得很慢,阻塞了UI线程。当然,我确实有一种比较复杂的更新方式:

  1. Slider(在viewgroup子类中)更新其值并发送消息给delegate(实现特定于该viewgroup子类的接口)
  2. Delegate(包含模型和控件子视图)告诉Plan实例设置一个新值,这将触发Plan重新计算它的输出。一旦计划完成它的计算,它发送另一个消息给委托,然后告诉它的输出视图更新新的值。

我是根据我开发的一个iOS应用程序建模这个架构的,这个应用程序在运行计算时似乎没有那么大的问题。

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

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

你看过Observer和Observable吗?也许您观察到的模型可以使用Runnable执行更新,然后通知观察者。

这只是我的一个想法:

你可以实现某种Queue .

,而不是每次从滑块更新都启动一个新线程。

您需要a来运行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.
  }
}

这样做将允许每次更新在下一次开始之前完成。我不确定它的性能如何。我还没有测试过。这只是一个想法。

相关内容

  • 没有找到相关文章

最新更新