所以,我一直在开发一个具有Plan模型的应用程序,该模型具有许多不同的输入和输出,并且应用程序的布局具有用于输出的输入和标签的滑块控件。当输入更改时,它会更新模型,然后运行计算,然后更新视图。我一开始并不认为这个体系结构有什么问题,但即使是简单的计算似乎运行起来也很慢,阻塞了UI线程。当然,我确实有一种更复杂的更新方式:
我已经根据我开发的iOS应用程序对这个架构进行了建模,这个应用程序似乎没有运行计算的大问题。
现在,我知道Android与iOS有很大的不同,所以我想知道我是否会完全错误。有没有办法告诉这些视图观察计划模型的变化,然后获取它应该显示的值?
我在这里看到的另一个主要问题是滑块输入。如果我将模型更新计算放入线程中,则每次滑块更改时,都会创建一个新线程。这些线程(正如我所见)将或多或少地以随机顺序完成,以这样的方式更新视图,因为当您应该看到增量更改时也很有意义。是否有一种很好的方法可以使用搜索栏进行线程计算?
答案 0 :(得分:1)
您是否看过Observer和Observable? 也许您观察到的模型可以使用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.
}
}
执行此操作将允许每个更新在下一个更新开始之前完成。我不确定它在性能方面会怎样做。我没有测试它或任何东西。这只是一个想法。