0

そのため、私はさまざまな入力と出力を備えたPlanモデルを備えたアプリに取り組んでいます。アプリのレイアウトには、入力用のスライダーコントロールと、出力用のラベルがあります。入力が変更されると、モデルが更新され、モデルが計算を実行してから、ビューを更新します。最初はこのアーキテクチャに問題があるとは思いませんでしたが、単純な計算でも実行速度が非常に遅く、UIスレッドがブロックされているようです。確かに、私は物事を更新するためのやや複雑な方法を持っています:

  1. Slider(ビューグループサブクラス内)はその値を更新し、デリゲート(そのビューグループサブクラスに固有のインターフェイスを実装する)にメッセージを送信します。
  2. Delegate(モデルとコントロールサブビューを保持する)は、Planインスタンスに新しい値を設定するように指示します。これにより、Planはその出力を再計算します。
  3. プランが計算を完了すると、デリゲートに別のメッセージを送信します。デリゲートは、出力ビューに新しい値で更新するように指示します。

私が開発したiOSアプリからこのアーキテクチャをモデル化しましたが、計算の実行にそれほど大きな問題はないようです。

さて、AndroidはiOSとは大きく異なることを知っているので、これについて完全に間違っているのではないかと思います。これらのビューに、プランモデルの変更を監視してから、表示されるはずの値を取得するように指示する方法はありますか?

ここで私が見ているもう1つの大きな問題は、スライダー入力に関するものです。モデル更新の計算をスレッドに入れると、スライダーが変更されるたびに、新しいスレッドが作成されます。これらのスレッド(私が見てきたように)は、多かれ少なかれランダムな順序で終了し、増分変更が表示される必要があるときにほとんど意味がないような方法でビューを更新します。シークバーで変更可能であると思われる計算をスレッド化する良い方法はありますか?

4

2 に答える 2

1

ObserverObservableを見たことがありますか?おそらく、観察されたモデルはRunnableを使用して更新を実行し、オブザーバーに通知することができます。

于 2011-11-30T22:19:42.233 に答える
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.
  }
}

これを行うと、次の更新が開始される前に各更新を終了できます。パフォーマンスがどうなるかわかりません。私はそれか何かをテストしていません。それはただのアイデアでした。

于 2011-12-01T14:59:26.620 に答える