, , . TimedTaskExecutor, x . x , . AsyncTask, Handlers CountdownTimer, .
:
package com.example.myapp;
import java.util.concurrent.TimeUnit;
public class TimedTaskExecutor {
private double intervalInMilliseconds;
private IVoidEmptyCallback callback;
private long sleepInterval;
public TimedTaskExecutor(double intervalInMilliseconds, IVoidEmptyCallback callback, long sleepInterval) {
this.intervalInMilliseconds = intervalInMilliseconds;
this.callback = callback;
this.sleepInterval = sleepInterval;
}
private IVoidEmptyCallback getCallback() {
return callback;
}
private double getIntervalInMilliseconds() {
return intervalInMilliseconds;
}
private long getSleepInterval() {
return sleepInterval;
}
public void run(ICallback<Boolean> isRunningChecker) {
long nanosInterval = (long) (getIntervalInMilliseconds() * 1000000);
Long previousNanos = null;
while (isRunningChecker.callback()) {
long nanos = TimeUnit.NANOSECONDS.toNanos(System.nanoTime());
if (previousNanos == null || (double) (nanos - previousNanos) >= nanosInterval) {
getCallback().callback();
if (previousNanos != null) {
previousNanos = nanos - (nanos - previousNanos - nanosInterval);
} else {
previousNanos = nanos;
}
}
if (getSleepInterval() > 0) {
try {
Thread.sleep(getSleepInterval());
} catch (InterruptedException ignore) {
}
}
}
}
public interface IVoidEmptyCallback {
public void callback();
}
public interface ICallback<T> {
public T callback();
}
}
, :
private boolean running;
Handler handler = new Handler();
handler.postDelayed(
new Runnable() {
@Override
public void run() {
running = false;
}
},
5000
);
HandlerThread handlerThread = new HandlerThread("For background");
handlerThread.start();
Handler background = new Handler(handlerThread.getLooper());
background.post(
new Runnable() {
@Override
public void run() {
new TimedTaskExecutor(
10,
new TimedTaskExecutor.IVoidEmptyCallback() {
private int counter = 1;
@Override
public void callback() {
Log.d("runTimedTask", String.valueOf(counter++));
}
},
2
).run(
new TimedTaskExecutor.ICallback<Boolean>() {
@Override
public Boolean callback() {
return running;
}
}
);
}
}
);
500 x. ( )