Вы можете использовать postDelayed
в обработчике для последующего вызова вашего метода в потоке пользовательского интерфейса, чтобы вы могли обновить пользовательский интерфейс.
На самом деле есть очень хорошая статья о том, как это делается на Android:http://developer.android.com/resources/articles/timed-ui-updates.html
Вы можете получить обработчик, либо создав его в коде, выполняемом в потоке пользовательского интерфейса, либо вызвав getHandler()
для представления (например, самой кнопки).
I 'Можно привести пример, но ссылка на статью уже делает это с большой детализацией и ясностью, поэтому я откладываю на это.
Редактировать : вот приблизительный обзор того, как это будет выглядеть.У меня сейчас нет установленного Android SDK, поэтому я не могу убедиться, что это работает.
public class CountdownButton extends Button {
private boolean isCounting = false;
private int count;
private final Runnable countdownRunnable = new Runnable() {
@Override
public void run() {
setText(Integer.toString(count));
if (count > 0) {
count--;
getHandler().postDelayed(countdownRunnable, 1000);
} else {
// count reached zero
isCounting = false;
setText("boom");
}
}
}
private final View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isCounting) {
// stop counting
isCounting = false;
getHandler().removeCallbacks(countdownRunnable);
setText("cancelled");
} else {
// start counting
isCounting = true;
count = 10;
countdownRunnable.run();
}
}
}
public CountdownButton(Context context) {
super(context);
setOnClickListener(onClickListener);
}
public CountdownButton(Context context, AttributeSet attrs) {
super(context, attrs);
setOnClickListener(onClickListener);
}
public CountdownButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOnClickListener(onClickListener);
}
}
Время может быть не идеальным (особенно если выполняется много других операций с процессором), но это должно быть достаточно для ваших целей.