Thread.sleep() nie jest gwarantowane. Oznacza to, że może on spać lub może nie spać przez określony czas z różnych powodów, które są poza tematem dla tego pytania.
Jeśli szukać w sieci dla „zegar w android” prawdopodobnie będzie lądować na te dwa: https://developer.android.com/reference/java/util/Timer.html i https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html
Można je sprawdzić, jednak nie będę korzystać z tych, ponieważ dostarczają one wiele innych funkcjonalności jak sugeruje nazwa ("ScheduledThreadPoolExecutor"). Nie potrzebujesz tego, ponieważ jest to najprawdopodobniej używane w dużych systemach z wieloma wątkami itp.
Jeśli dobrze rozumiem Twój kod, próbujesz zaktualizować pasek postępu. Do tego, co próbujesz zrobić, sugerowałbym użycie handler'a.Jednym z głównych zastosowań handlera jest zaplanować wiadomości i runnables być wykonany jako pewnym momencie w przyszłości, jak określono w docs tutaj: http://developer.android.com/reference/android/os/Handler.html
zrobiłbym to tak:
int counter = 0;
int delayInMs = 5000; // 5 seconds
Handler timer = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
counter++;
// If the counter is mod 5 (or whatever) lower the delay
if (counter % 5 == 0) {
delayInMs/=100; // Or any other calculation.
}
// If the counter reaches 100 the counting will not continue.
if (counter <= 100) {
// If the counter has not reached the condition to stop, the handler
// will call the timer again with the modified (or not) delay.
timer.sendEmptyMessageDelayed(0, delayInMs);
// Change progress
updateProgress(counter);
}
return true;
}
});
// ...
// Somwhere in the code to start the counter
timer.sendEmptyMessageDelayed(0, delayInMs); // starts the timer with the initial 5 sec delay.
Jeszcze jedna rzecz. W wierszu, w którym masz ten kod:
progress.setProgress(t);
Bądź ostrożny podczas wywoływania elementów interfejsu z innych wątków jest źródłem wielu głowy. Jeśli twój program obsługi znajduje się w innym wątku, powinieneś zawinąć to wywołanie w funkcję i upewnić się, że jest wywoływane z głównego wątku (tj. Wątku UI). Wiele sposobów na osiągnięcie tego (nie zawsze jest konieczne). Jednym z nich jest tak:
private void updateProgress(int counter) {
WhateverActivity.this.runOnUiThread(new Runnable() {
public void run() {
progress.setProgress(counter);
}
});
}
Czy możesz pokazać więcej kodu? Gdzie zainicjujesz timer? – Wishmaster