1

アルゴリズムの進行状況を視覚的に表現する従来のフラッド フィル アルゴリズムを実行したいと考えています。つまり、アルゴリズムのシーケンスを示すために黒に変わる一連のボタンです。再帰アルゴリズムの反復バージョンを作成してごまかすつもりはありません。不適切なタブ付き疑似コードの先:

public void floodFill(int x, int y, String targetColor,String replacementColor) {
            if *out of bounds* return
              else
               if button = target then return
                else
                 Switchbuttontoblack(button);
                 PAUSE;
         floodFill(x - 1, y, targetColor, replacementColor);
         floodFill(x + 1, y, targetColor, replacementColor);
         floodFill(x, y - 1, targetColor, replacementColor);
         floodFill(x, y + 1, targetColor, replacementColor);
}

ただし、アルゴリズムはそこで実行されますが、ボタンはアルゴリズムの最後に一度に色が変わるだけです。

これは、テキストビュー (UI) を更新する Android タイマーのように、非 UI スレッドが原因である可能性があります。

したがって、アルゴリズムの PAUSE 行にランナブルを実装しました (つまり、handler.post(runnable
);

実行可能な場所

private Runnable runnable = new Runnable() {
       public void run() {

            Log.d("RUNableworking","RUNableworking");
            handler.postDelayed(this, 1000);

       }
    };

Floodfill スレッドからの実行 = 何もありません。onCreate から実行すると、ログが正常に表示されます。

私はランナブルをポーリングすることにあまり熱心ではありません。これを行うより良い方法があるはずですか?

4

1 に答える 1

1

Activity には runOnUiThread() というコマンドがあり、非常に便利です。唯一の問題は、実行中の UI がキューに入れられることです。Handler オブジェクトを使用して、UI 更新呼び出しを UI スレッドに送信することもできます。

ただし、段階的に進めている場合、本当に別のスレッドを使用する必要があるのでしょうか?

更新: onDraw() でフラッド フィルを実行していますか? そうなると一歩も進まない

于 2012-11-05T14:00:37.767 に答える