Android 调整TimerTask间隔

Android 调整TimerTask间隔,android,timer,timertask,Android,Timer,Timertask,我试图通过使用scheduleatfixedrate创建一个可调整的时间序列。 然而,当我编写这段代码时,我不知道除非清除计时器,否则执行后不能更改周期 这是我对一系列有序事件的尝试: @Override protected void onStart() { super.onStart(); Timer timer = new Timer(); GregorianCalendar gCal = (GregorianCalendar) GregorianCalenda

我试图通过使用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);



}
@覆盖
受保护的void onStart()
{
super.onStart();
定时器=新定时器();
GregorianCalendar gCal=(GregorianCalendar)GregorianCalendar.getInstance();
最终可运行计数除法=新可运行()
{
公开募捐
{
/**
*开始序列并在到达最后一个位置时缠绕
*/
如果(playSequenceButton.isChecked())
{
setEnabled(真);
int length=sequencer.getLength();
int i=sequencer.getPosition();
二极管[i]。设置已检查(真);
如果(i>0)
二极管[i-1]。设置检查(假);
if(i<1)
二极管[长度]。设置检查(假);
}
/**
*停止并重置序列
*/
其他的
{
对于(int i=0;i
您建议用什么方法来设置可以动态更改的时段? 当可运行countDivision运行时,sixteenN变量需要能够更改。 也许timertask不是合适的工具

问候
/M

只需取消并重新安排时间任务

我会避免使用TimerTask,而是使用a。该处理程序对于跨线程通信、延迟和计时器非常有用,而且实际上使用起来非常简单

以下示例显示如何使用处理程序创建定时事件循环:-

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中,如果您想要定时事件,处理程序是正确的选择,您可以使用几个选项向处理程序发送消息,甚至可以使用Runnable:-

    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替换为一个可以动态更改的时间间隔,以执行您想要的操作。

每次使用一个新的计时器。或者使用报警管理器,这是如此明显,我甚至没有看到它。。谢谢但是,这会导致事件以两个不同的间隔运行。我想我需要取消前一个计时器,但这给了我一个nullpointerexception。我只是在格式和放置内容方面出现一些问题后才这样做的。现在很好用^^