1

我需要执行占空比功能以在某些时间段内使用级联计时器运行两个操作,例如在使用 timer1 运行操作 1 的 ON 时间段(x 秒)以及当计时器 1 完成时,然后是第二个关闭时间段(y 秒)使用 timer2 运行操作 2 并很快重复该场景。我是初学者程序员

请任何人帮助我正常运行。

我试图编写下面的代码,它看起来像:

 package com.example.periodictimer;

公共类 MainActivity 扩展 Activity {

Timer t1 = new Timer();
Timer t2 = new Timer();
TimerTask mTimerTask1;
TimerTask mTimerTask2;
TextView tv1;
TextView tv2;
boolean z;
Handler hand = new Handler();
Handler hand1 = new Handler();
Button hButtonStart;
int time =0;
int time1 =0;
boolean flag1;

@Override protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);

doTimerTask1();

} 公共无效 doTimerTask1(){

mTimerTask1 = new TimerTask() {
    public void run() {
        hand.post(new Runnable() {
            public void run() {
                time++;
                tv1.setText("Execute Operation1: " + time);
                doTimerTask2();
            }
        });

    }
    };

    // public void schedule (TimerTask task, long delay, long period) 
    t1.schedule(mTimerTask1,0, 3000);  // 

}

公共无效doTimerTask2(){

mTimerTask1 = new TimerTask() {
    public void run() {
        hand.post(new Runnable() {
            public void run() {
                time1++;
                // update TextView
                tv2.setText("Execute Operation2:" + time1);

                //Log.d("TIMER", "TimerTask run");
            }
        });
    }};

    // public void schedule (TimerTask task, long delay, long period) 
    t1.schedule(mTimerTask2,500, 5000);  // 

}

}

4

1 回答 1

0

我建议您使用两个计时器和scheduleAtFixedRate方法而不是schedule方法。

此方法的工作原理如下scheduleAtFixedRate(timerTask, delay, period)

其中: TimerTask:要执行的任务是TimerTask类的一个实例。在这里,您可以在其中一个计时器任务中打开您的标志,并在另一个任务中将其关闭。

delay:第一次运行任务之前的延迟量。

period:定时器任务连续执行之前的占空比周期。

诀窍是安排两个具有相同延迟周期周期的计时器,但其中一个以 0 延迟开始,而另一个以延迟 = ON_period 开始。

下面的代码示例在一个 java 程序中显示了它,其中一个标志打开 4 秒,然后关闭 2 秒,依此类推。

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;


public class TestTimer {
    TimerTask timerTask2;
    TimerTask timerTask1;
    Timer t1 = new Timer();
    Timer t2 = new Timer();

    boolean flag = true;
    private Date date;
    private DateFormat  dateFormat;

    public TestTimer() {
        flag = true;
        dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");;
    }

    public void test() {
        timerTask1 = new TimerTask() {

            @Override
            public void run() {
                flag = true;
                date = new Date();
                System.out.println("Task1  [" + (flag ? "ON" : "OFF" ) + "] " +
                dateFormat.format(date));
            }
        };

        timerTask2 = new TimerTask() {
            @Override
            public void run() {
                flag = false;
                date = new Date();
                System.out.println("Task2  [" + (flag ? "ON" : "OFF" ) + "] " +
                        dateFormat.format(date));
            }
        };



        t1.scheduleAtFixedRate(timerTask1, 0, 6000);
        t2.scheduleAtFixedRate(timerTask2, 4000, 6000);



    }
    public static void main(String [] args) {


        TestTimer tt = new TestTimer();
        tt.test();

    }
}
于 2013-08-22T22:09:18.367 回答