I am using a timer that should every 12 seconds issues a warning. as shown in the code below i set the delay to 0 so that the timer starts immediately, but at
run time, the below posted timer does not starts immediately it waits for the period set as a delay despit i set the delay to 0
in other words, the below timer should wait 0 sec as a delay and repeats itself every 12 seconds but what happens is, it at initial execution it waits 12 sec and repeat itself every 12 sec
any logical explaination why that is happening
code:
mVelWarningRule1Timer.scheduleAtFixedRate(
new SpeakOut(
getApplicationContext(),
getApplicationContext()
.getResources()
.getString(R.string.rule_velocity_1)),
0,
getApplicationContext()
.getResources()
.getInteger(R.integer.int_assistWarning_interval)
);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new RemindTask(), 0, 12000);
The first is the internal class. The second parameter is the delay. The third gives you the interval.
private class RemindTask extends TimerTask {
#Override
public void run() {
try
{
getActivity().runOnUiThread(new Runnable() {
public void run() {
if (page > adapter.getCount()) {
page = 0;
} else {
viewPager.setCurrentItem(page++, true);
}
}
});
}
catch(Exception e)
{
timer.cancel();
}
}
}
This would make a carousel of pictures change every 12 seconds
Related
I am new to programming and I am doing one android application on which I have one requirement where I need to monitor some logs for the 30s. I am using a timer task but what is happening, if the 30s are over and the run method executed once it is terminated the timer task not repeating.
Here is my code:
connectivityTimerTask = new ConnectivityTimerTask();
timer = new Timer(true);
//timer = new Timer(); // tried with this but it is not working
timer.schedule(connectivityTimerTask,30 * 1000);
TimerTask:
public class ConnectivityTimerTask extends TimerTask {
#Override
public void run() {
Log.error("----- ACK NotReceived -----" + System.currentTimeMillis());
//resetMonitor(); using this method I am setting the timer again
}
}
I want to know what's the best practice for scheduling repeating time.
Am I using the correct way? Can I use the resetMonitor() method?
Instead of of schedule(), You can use Timer task that can be scheduled at fixed rate with scheduleAtFixedRate,
int THIRTY_SECONDS = 30 * 1000;
Timer mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
// do whatever you want every 30s
Log.e("TAG", "----- ACK NotReceived -----" + System.currentTimeMillis());
}
}, 0, THIRTY_SECONDS);
Whenever you want to stop the timer call timer.cancel()
The line
timer.schedule(connectivityTimerTask,30 * 1000)
runs your task after a 30s delay and once the task completes, the timer's job is done.
If you want to keep running your task at periodic intervals, you have to also specify an interval period
schedule (TimerTask task, long delay, long period) // "period" specifies how often you want to run the task
Read the documentation here.
To repeatedly run some code after a set period of time, use a Runnable with a Handler like so
Handler handler = new Handler();
Runnable runnable = new Runnable() {
#Override
public void run() {
// do your logging
handler.postDelayed(this, 30000);
}
};
handler.post(runnable); // or handler.postDelayed(runnable, 30000) if you want it to wait 30s before starting initially
To cancel
handler.removeCallbacks(runnable);
Is there a way to run a timer task only after the method completes. The method could take 10 seconds but the timer is set to run every 5 seconds. I want it to run again only after the 10 seconds are up.
Timer timer = new Timer();
TimerTask task = new TimerTask() {
#Override
public void run() {
longRunningMethod();
timer.schedule(task, 0, 5000);
}
};
timer.schedule(task, 0, 10000);
You can use ScheduledExecutorService which has a scheduleWithFixedDelay() method which does exactly that.
"Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given delay between the termination of one execution and the commencement of the next."
So you could do
ExecutorService.newScheduledExecutor()
.submit(this::longRunningMethod, 0, 1000, ChronoUnit.MILLIS);
Removing the timer.schedule(task, 0, 5000); call will give you behavior you desire.
Your call of timer.schedule(task, 0, 10000); schedules repeating tasks every ten seconds.
You need to schedule one-shot timer tasks and create new TimerTask instance every time.
class MyTimerTask extends TimerTask {
private final Timer timer;
private final long nextScheduleDelay;
MyTimerTask(Timer timer, long nextScheduleDelay) {
this.timer = timer;
this.nextScheduleDelay = nextScheduleDelay;
}
#Override
public void run() {
longRunningMethod();
timer.schedule(new MyTimerTask(timer, nextScheduleDelay), nextScheduleDelay);
}
}
Timer timer = new Timer();
timer.schedule(new MyTimerTask(timer, 1000), 0);
I have a requirement, where I need to create a timer task which will execute the function after every 10 sec. There is reset Button, on click of that reset Button I want to reset my time from 10 sec to 30 sec. Now after 30 sec when it execute the function I need to reset my timer again to 10 sec. I tried using Handler , TimerTask and CountDownTimer, but not able to achieve the requirement. Can anyone suggest me the best way of solving this problem
// OnCreate of Activity
if (timerInstance == null) {
timerInstance = Timer()
timerInstance?.schedule(createTimerTask(), 10000L, 10000L)
}
private fun createTimerTask(): TimerTask {
return object : TimerTask() {
override fun run() {
Log.d("TimerTask", "Executed")
//presenter?.onCountdownTimerFinished(adapter.activeCallList, adapter.previousPosition)
}
}
}
//On Reset Button Click
timerInstance?.cancel()
timerInstance = Timer()
timerInstance?.schedule(createTimerTask(), 30000L, 30000L)
When your button is pressed, you could cancel the submitted TimerTask and reschedule with a delay of 30sec and a period of 10sec ?
https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html#scheduleAtFixedRate-java.util.TimerTask-long-long-
Cancel the first submitted task by calling .cancel on it.
use 30000L, 10000L as delay and period on the schedule in the button
Example code :
package so20190423;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
public static void main(String[] args) {
System.out.println(new Date());
Timer timer = new Timer();
TimerTask task = newTask();
timer.scheduleAtFixedRate(task, 10000L, 10000L);
task.cancel();
timer.scheduleAtFixedRate( newTask(), 30000L, 10000L);
}
protected static TimerTask newTask() {
return new TimerTask() {
#Override
public void run() {
System.out.println("YO");
System.out.println(new Date());
}
};
}
}
HTH!
So, I basically need a command to run every 5 seconds, but the Timer doesn't work...
I tried so many different methods,
The only thing that works is the Thread.sleep(Milliseconds);
But that causes my whole game to stop working...
If I try using a timer, for example:
Timer timer = new Timer(1000, new ActionListener(){
#Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hey");
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
How can I get this timer to fire correctly?
You should pair java.util.Timer with java.util.TimerTask
Timer t = new Timer( );
t.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
System.out.println("Hey");
}
}, 1000,5000);
1000 means 1 second delay before get executed
& 5000 means will be repeated every 5 seconds.
To stop it , simply call t.cancel()
How do I make my Timer Task run more than once? This is really bothering me..
timer = new Timer();
timer.schedule(new Client(), 1000);
public void run() {
try {
System.out.println("sent data");
socketOut.write(0);
} catch (Exception e) {
// disconnect client on their side
Game.destroyGame();
timer.cancel();
timer.purge();
}
}
I want this timer to run for an infinite amount of time until the Exception occurs.
When the Javadoc says that it repeats with a specific delay, the delay is the initial delay before the TimerTask starts and not for how long the TimerTask will run. You can repeat the task every period milliseconds. Look at the schedule method. Below is a simple example that repeats every 2 seconds, indefinitely. In the example, the call:
timer.schedule(new RemindTask(seconds), 0, seconds * 1000);
tells timer to run the RemindTask every seconds seconds (*1000 because the time here is really in miliseconds), with an initial delay of 0 - i.e. start the RemindTask right away and then keep repeating at regular intervals.
import java.util.Timer;
import java.util.TimerTask;
public class Main {
static Timer timer;
static int i = 0;
class RemindTask extends TimerTask {
private int seconds;
public RemindTask(int seconds) {
this.seconds = seconds;
}
public void run() {
i+= seconds ;
System.out.println(i + " seconds!");
}
}
public Main(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(seconds), 0, seconds * 1000);
}
public static void main(String args[]) {
new Main(2);
System.out.format("Task scheduled.%n");
}
}
Looks like to me you're running a GUI program (I'm assuimg SWING, because your other question you were using SWING). So here's a bit of advice. Use a javax.swing.Timer for Swing program.
"How do I make my Timer Task run more than once? "
javax.swing.Timer has methods .stop() and .start() and .restart(). A basic implementation of the Timer object is something like this
Timer timer = new Timer(delay, new ActionListener(){
#Override
public void actionPerformed(ActionEvent e) {
// do something
}
});
timer.start();
You can do anything you want in the actionPerformed and it will fire an event every how many ever milliseconds you provide to the delay. You can have a button call .start() or .stop()
See this answer for a simple implementation of Timer imitating a sort of stop watch for a Boggle game