Make a Libgdx Timer run once - java

My Goal: Make one script wait .5 seconds, run, make another script wait .5 seconds, run.
The problem I am running into is that Timer.instance().clear(); makes the run() method only run once, on it's own it runs more than once. But, it also deletes Timer2 because it does not wait .5 seconds to run the code after the timer you scheduled (clear() removes all Timers/scheduled tasks). So, it ends up deleting the the Timer2 after .5 seconds.
Edit: Made a dumb error, I was not recognizing how the method was being called. I got it fixed :)
//Timer1
Timer.schedule(new Task(){
#Override
public void run() {
// \/ removes both Timer1 and Timer2
Timer.instance().clear();
}
}, .5f);
//Timer2
Timer.schedule(new Task(){
#Override
public void run() {
Timer.instance().clear();
}
}, 1f);

This works: "Make instance of timers: Timer timer1 = new Timer(); and Timer timer2 = new Timer(); then assign your schedules and code will run only once automatically. Like that: timer1.scheduleTask(....)" – aloupas

Related

Java timer working weird/not working

So I'm making a game and I need a timer to regend/deregen stamina from the player.
Here's my current code:
Timer staminaTimer = new Timer(); //Java.util timer
public void update() {
staminaTimer.schedule(new TimerTask(){
public void run() {
//regen/Deregen stamina
}
}, 0L, 10L * 1000L);
}
So this timer is in an method that is getting called every game tick. I don't know why but if I put a print in the run() its starts normally then becomes really fasts and crashes everything. I would really like to know another way of making a repeating timer or the fix of this... Thanks for help in advance.

How to change a java timer's interval

I'm working on an android Tetris game. And an IllegalStateException occurred when executing
timer.scheduleAtFixedRate (task, 0L, milliseconds);
in
public void setTimerInterval (int milliseconds) {
timer.cancel ();
timer = new Timer ();
timer.scheduleAtFixedRate (task, 0L, milliseconds);
}
Am I doing this wrongly or something?
I need to cancel the timer and create a new one because I cannot change the interval of the timer unless you schedule a new task for it, right?
I read a post here and here is a quote of one of the answers:
A timer can only be scheduled once. If IllegalStateException isn't happening when you call cancel(), but when you try to reschedule the timer, just reinstantiate the timer and then schedule it. Otherwise, I'm not sure.
I didn't use the accepted answer of the that question because it's about pausing and resuming the timer.
I reinstantiated the timer as shown above but there is still a IllegalStateException.
Handler handler = new Handler();
handler.post(new Runnable() {
#Override
public void run() {
// do the task here
handler.postDelayed(this, milliseconds); // set time here to refresh textView
}
});
Make the milliseconds global and change that, maybe that would be a better solution.
How to change a java timer's interval
Java Timers don't have intervals. Timer tasks have intervals.
Solution: cancel and reschedule the TimerTask, not the Timer.

Timer tick event not running

I am writing a script that will cause the players HP to decrease at an interval as long as they are within a range of the item/monster/lava whatever it is. I have the detection just fine, but I cant seem to get the interval to run. I know this is probably because I am creating a new TimerTask as I render, but I cant seem to figure it out.
for(Monster monster : monsters) {
renderer.processEntity(monster);
if(player.withinDistance(10, monster.getPosition()))
timer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
System.out.println("tick");
Player.PLAYER_HEALTH -= 10;
}
}, 2000, 2000);
}
So for all monsters, it checks the positions, if you are near it opens a timer task that should tick every 2 seconds while that condition is true. How can I make this work properly? Is a timer task optimal for this situation?
The problem here is that you are updating the PLAYER_HEALTH static property of the Player class. You should update the Player instance!
for(Monster monster : monsters) {
renderer.processEntity(monster);
if(player.withinDistance(10, monster.getPosition()))
timer.scheduleAtFixedRate(new TimerTask() {
#Override
public void run() {
System.out.println("tick");
player.decreaseHealth(10); // Use the instance
}
}, 2000, 2000);
}
Also, if your program ends, the TimerTask will end too. Make sure your program is still running.

Android timer one thread only

I'm having problem with Android timer's scheduleAtFixedRate option.
Timer timer = new Timer();
TimerTask myTimerTask = new TimerTask() {
public void run() {
...
}
};
timer.scheduleAtFixedRate(myTimerTask, 0, 5000);
This snippet is doing bad things for me. It's executed in the service so every time method is called timer creates a new thread and executes the same code while the old thread is still running; that creates performance problems. I need to run the code in the run() method every 5 seconds but I want the old task to be canceled. Is there any way to handle this problem ?
You can use the timer.cancel() to stop the timer.
For example, I had an end button to finish the timer early:
finishEarlyButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
timer.cancel();
}
});

timer.schedule variable speed

i wan't a timer do a job every 2.5 seconds (at the start of the program),
that is working with the following code.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
// #Override
#Override
public void run() {
here is the code, and i do Speed = Speed-500
}, Speed,Speed);
Speed is a int:
public int Speed=2500;
buth the problem is that the speed of the timer stays on the 2500, while the variable speed lowers each time with 500, so that part is working. Only the timer doesn't check if Speed has changed.
Can somebody help me with this?
you cant do that because it will fix that with Timer once you done the schedule.
Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay. Subsequent executions take place at approximately regular intervals separated by the specified period.
In this case you can cancel the previous one and schedule new TimerTask.
Timer timer = new Timer();
initialize the speed here
loop based on time
timer.schedule(new TimerTask() {
// #Override
#Override
public void run() {
here is the code, and i do Speed = Speed-500
}, Speed,Speed);

Categories