0

タイトルがやや混乱していることはわかっていますが、私の問題は次のとおりです。sleep(ms) を使用して (ループ経由で) プログラムを複数回「一時停止」し、ユーザーが押したいくつかのボタンに変更を加えたいと考えています。UI の変更はメイン スレッドでしかできないことを理解しているので、このコードを Async タスクに変換する方法を考えています。また、非同期タスクは一度しか呼び出せないということをどこかで読んだことを覚えていますか? その場合、他にどのような解決策を検討できますか?

View.OnClickListener SimulateButtonHandler = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        for(int j=0;j<169;j++) //169 buttons to click
        {
            if(ClickedPoints[j]!=null) //how I keep track of which buttons has clicked
            {       //clear button color
                Drawable d2 = ClickedPoints[j].getBackground();  
                ClickedPoints[j].invalidateDrawable(d2);  
                d2.clearColorFilter();
            }

        }

        Timer timer = new Timer();

        for(int i=0;i<169;i++)
        {
            if(ClickedPoints[i]!=null)
            {       //change the color after some time
                Simulate(timer, i);
                //clear color again
                Drawable d2 = ClickedPoints[i].getBackground();  
                ClickedPoints[i].invalidateDrawable(d2);  
                d2.clearColorFilter();

            }

        }
}   
};

public void Simulate(Timer timer, final int index)
{
    timer.schedule(new TimerTask()
    {
        public void run() {
            Sim(index);
        }

    }, 1000); //delay for some amount of time, then rehighlight the button
}

private void Sim(int i)
{
    Drawable d1 = ClickedPoints[i].getBackground();  
    PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);  
    d1.setColorFilter(filter);
}
4

1 に答える 1

0

Thread を使用してバックグラウンド作業 (および一時停止) を実行し、Handler を使用して UI スレッドにアクセスすることをお勧めします。

これは、スレッドでハンドラーを使用するための優れたチュートリアルです。

于 2012-06-25T20:32:22.657 に答える