0

私はscheduleatfixedrateを使用して時間の調整可能なシーケンスを作成しようとしていました。ただし、このコードブロックを作成したとき、タイマーが削除されない限り、実行後の期間を変更できないことを知りませんでした。

これは、一連の一連のイベントでの私の試みです。

@Override
protected void onStart()
{


    super.onStart();

    Timer timer = new Timer();
    GregorianCalendar gCal = (GregorianCalendar) GregorianCalendar.getInstance();




    final Runnable countDivision = new Runnable()
    {
        public void run()
        {

            /**
             * Starts the sequence and wraps around when reached the last position
             */

            if(playSequenceButton.isChecked())
            {
                setEnabled(true);
                int length = sequencer.getLength();
                int i = sequencer.getPosition();
                DIODE[i].setChecked(true);
                if(i > 0)
                    DIODE[i-1].setChecked(false);
                if (i < 1)
                    DIODE[length].setChecked(false);



            }
            /**
             * Stops and resets the sequence
             */
            else
            {
                for (int i = 0; i < sequencer.getLength(); i++)
                    DIODE[i].setChecked(false);

                sequencer.setPosition(START_POSITION);
                setEnabled(false);

            }
        }
    };

    int millis = 999 - gCal.get(GregorianCalendar.MILLISECOND);
    int inputBPM = TEMPO;
    long qtrN=Math.round(((60000/inputBPM))*100000)/100000;

    long sixteenN = (qtrN/4);
    sixteenN=Math.round(sixteenN*100000)/100000;


    timer.scheduleAtFixedRate(new TimerTask()
    {

        @Override
        public void run()
        {
            //              setEnabled(true);
            runOnUiThread(countDivision);               

        }

    }, 0, sixteenN);



}

動的に変更できる期間を設定するには、どのような方法をお勧めしますか?16N変数は、実行可能なcountDivisionの実行中に変更できる必要があります。たぶん、timertaskは適切なツールではありませんか?

よろしく/M

4

2 に答える 2

1

TimerTask をキャンセルして再スケジュールするだけです。

于 2013-02-06T22:05:56.143 に答える
1

私は TimerTask を避け、代わりにHandlerを使用します。Handler はクロススレッド通信、遅延、およびタイマーに役立ち、実際に使用するのは非常に簡単です。

次の例は、ハンドラーを使用して時限イベント ループを作成する方法を示しています。

public class HandlerExampleActivity extends Activity {
    private static final String TAG = HandlerExampleActivity.class.getSimpleName();

    private static final int MSG_PING = 1;
    private static final long MSG_DELAY = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ping();
    }

    void ping() {

        Log.d(TAG, "Ping!");

        mHandler.sendEmptyMessageDelayed(MSG_PING, MSG_DELAY);
    }

    void pong() {
        Log.d(TAG, "Pong!");

        ping();
    }

    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            if(msg.what == MSG_PING) {
                pong();
            }
        };
    };
}

Android では、時限イベントが必要な場合はハンドラーが適切な方法です。ハンドラーにメッセージを送信するために使用できるいくつかのオプションがあり、Runnables を使用することもできます。

    mHandler.sendEmptyMessage(MSG_PING); // Send ping (almost) immediately
    mHandler.sendEmptyMessageAtTime(MSG_PING, 
                             SystemClock.uptimeMillis() + MSG_DELAY); // one second from now
    mHandler.postAtTime(new Runnable() { // Even post runnables!
        @Override
        public void run() {
            // TODO Something...
        }
    }, MSG_DELAY);    

MSG_DELAY を、動的に変更できる間隔に置き換えて、必要なことを行うことができます。

于 2013-02-06T22:47:26.510 に答える