nie wiązał bym tego z celowoscią
goto nie używa się od wieków, jedynie w językach które korzeniami tkwią głęboko w prehistorii takie archaizmy są nadal obecne
Java (Android) udostępnia mnóstwo narzędzi do wykonania tego zadania: Timer, Handler to takie najpopularniejsze dla krótkich okresów czasu
tobie zapętlenie nie jest potrzebne ale zaplanowanie wykonanie, mógł byś wrzucić tę pętle w nowy wątek dzięki temu nie blokował by się główny wątek i UI ale tak się tego nie robi, poza tym twoja konstrukcja zapętla program na zawsze
fragment klasy minutnika
public class Repeat implements Runnable {
public static final int MILLIS = 1;
public static final int SECUND = 1000;
public static final int MINUTE = 60000;
private static enum Running {YES, NO}
private final Handler mHandler = new Handler();
private volatile Running mRunning = Running.NO;
private Repeat.execute mCallBack = null;
private int mCycleTime;
private int mEndTime;
private long mStartTime = 0;
public Repeat(Repeat.execute callBack) {
mCallBack = callBack;
}
public interface execute {
boolean onExecute(long runningTime);
void onFinish(long runningTime);
}
public boolean start(final int beginTime, final int cycleTime, final int endTime, final int unit) {
if (mRunning == Running.YES) return false;
mStartTime = System.currentTimeMillis() + beginTime * unit;
mCycleTime = cycleTime * unit;
mEndTime = endTime * unit;
if (mHandler.postDelayed(this, beginTime * unit)) {
mRunning = Running.YES;
return true;
}
return false;
}
public void stop() {
mRunning = Running.NO;
mHandler.removeCallbacks(this);
}
public boolean running() {
return mRunning == Running.YES;
}
public void run() {
if (mCallBack != null) {
final long currentTime = System.currentTimeMillis() - mStartTime;
if (mRunning == Running.YES && (mCallBack.onExecute(currentTime) || currentTime < mEndTime)) {
mHandler.postDelayed(this, mCycleTime);
} else {
mCallBack.onFinish(currentTime);
}
}
}
}
używa się tego tak:
private Repeat repeatTask;
@Override
public void onCreate() {
super.onCreate();
repeatTask = new Repeat(mExecute);
}
private final Repeat.execute mExecute = new Repeat.execute() {
public boolean onExecute(long runningTime) {
//to jest wykonywane co określony okres czasy np: minute
return true;
}
public void onFinish(long runningTime) {
//to zostanie wykonane kiedy minutnik zostanie zatrzymany
}
};
//to rozpoczyna cykl np: minutowy
repeatTask.start(0, 1, 0, Repeat.MINUTE);
//to wyłącza minutnik
repeatTask.stop();
lub inna klasa która robi dokładnie to samo ale jest trochę bardziej surowa i używa Timer:
public abstract class Repeat {
public enum Running {YES, NO};
private Timer mExecutor;
private TimerTask mTask;
private volatile Running mRunnung = Running.NO;
public void start(final int statTime, final int cycleTime) {
if (mRunnung == Running.YES) throw new RejectedExecutionException("Task already running.");
mRunnung = Running.YES;
mExecutor = new Timer("Repeat", true);
mTask = new TimerTask() {
public void run() {
execute();
}
};
mExecutor.scheduleAtFixedRate(mTask, statTime, cycleTime);
}
public void stop() {
mTask.cancel();
mExecutor.cancel();
mExecutor.purge();
mRunnung = Running.NO;
}
public boolean running() {
return mRunnung == Running.YES;
}
protected abstract void execute();
}
więc jak widzisz jest mnóstwo sposobów, ale na twoim poziomie zaznajomienia z językiem nic nie pomorze 😉