所以,我一直在一个应用程序,有一个计划模型与许多不同的输入和输出,和应用程序的布局有滑块控件的输入和标签的输出。当输入发生变化时,它会更新模型,然后运行计算,然后更新视图。起初我并不认为这种架构有什么问题,但即使是简单的计算似乎也运行得很慢,阻塞了UI线程。当然,我确实有一种比较复杂的更新方式:
- Slider(在viewgroup子类中)更新其值并发送消息给delegate(实现特定于该viewgroup子类的接口)
- 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.
}
}
这样做将允许每次更新在下一次开始之前完成。我不确定它的性能如何。我还没有测试过。这只是一个想法。