0

ボタンをクリックすると、次の関数を呼び出しています。

private void badButtonHandler() {
    Camera.Parameters params = mCamera.getParameters();
    params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
    mCamera.setParameters(params);
    if(thread != null){
        thread = null;
    }
    thread = new Thread()
    {
        @Override
        public void run() {
            try {
                while(true) {
                    sleep(5000);
                    Camera.Parameters params = mCamera.getParameters();
                    params.setColorEffect(Camera.Parameters.EFFECT_NONE);
                    mCamera.setParameters(params);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    thread.start();
}

この関数は、ボタン クリックの 5 秒後にカメラの色効果を変更することを目的としています。関連するボタンを初めて押すと、期待どおりに動作します。ただし、この関数をさらに呼び出すと、期待どおりに動作しません。つまり、2 回目は 2 秒間待機し、その後はクリックするたびに値が減少します。

4

2 に答える 2

0

正確なタイマーとして sleep() に頼るべきではありません。指定された時間に自動的にウェイクアップして現在アクティブなスレッドになることはありません。これは、すべてのスレッドがスレッド スケジューラに翻弄されているという単純な事実のためです。間違いなく、特定の JVM に基づいて OS ごとに異なります。

このようなシナリオでは、私は常にカスタム タイマー関数に依存してきました。たとえば、次のようになります。

myTimer(System.nanoTime());

public static void myTimer(long startTime) {
    while (startTime + 5000000000 > System.nanoTime()) { //Wait for 5 seconds
        try {
            Thread.sleep(50); //Sleep at ~50 millisecond intervals
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Thread.sleep() は現在のスレッドをスリープ状態にするため、例で行ったように完全に新しいスレッドを作成する必要はありません。また、while(true) ループを使用することは、プログラミングの実践方法としては不十分です。

nanoTime()は、Java で使用できる最も正確なシステム タイマーであるため、使用することをお勧めします。

sleep() 関数の信頼性の低さに関する追加情報については、このドキュメントを参照してください。

于 2013-03-26T06:43:06.147 に答える
-1

これを試して

Thread timer = new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                //Your desired work
            }
        }
    });
    timer.start();
于 2013-03-26T07:01:06.363 に答える