Проблема
Вам нужен простой таймер обратного отсчета, программа, которая будет отсчитывать заданное количество секунд, пока не достигнет нуля.
Решение
Платформа Android поставляется со встроенным классом для создания таймера обратного отсчета CountDownTimers
. Он прост в использовании, эффективен и работоспособен (это само собой разумеется!).
Обсуждение
Для создания таймера обратного отсчета выполните следующие действия.
- Создайте подкласс Конструктор этого класса принимает два аргумента:
CountDownTimer (long millisInFuture, long countDownlnterval)
. Первый — это количество миллисекунд с того момента, когда нужно сделать интервал; на данный момент будет вызываться метод подклассаonFinish()
. Второй — частота в миллисекундах, определяющая, как часто вы хотите получать уведомления о том, что таймер все еще работает. Это типично для обновления монитора прогресса или другого обмена данными с пользователем. Ваш метод подклассаonTick()
будет вызываться каждый раз по истечении данного количества миллисекунд. - Переопределите методы
onTick()
- Создайте новый экземпляр класса
- Вызовите метод
start()
для вновь созданного экземпляра!
Пример программы для таймера обратного отсчета состоит из компоновки XML (показанной в примере 1) и некоторого кода Java (показанного в примере 2). При запуске он должен выглядеть примерно так, как показано на рис. 1, хотя время, вероятно, будет иным.
Пример 1. Файл main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/button"
android:text="Start"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TableLayout
android:padding="10dip"
android:layout_gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:id="@+id/timer"
android:text="Time: "
android:paddingRight="10dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/timeElapsed"
android:text="Time elapsed: "
android:paddingRight="10dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
</LinearLayout>
Пример 2. Файл Main, java
package com.examples;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Main extends Activity implements OnClickListener {
private MalibuCountDownTimer countDownTimer;
private long timeElapsed;
private boolean timerHasStarted = false;
private Button startB;
private TextView text;
private TextView timeElapsedView;
private final long startTime = 50 * 1000;
private final long interval = 1 * 1000;
/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startB = (Button) this.findViewById(R.id.button);
startB.setOnClickListener(this);
text = (TextView) this.findViewById(R.id.timer);
timeElapsedView = (TextView) this.findViewById(R.id.timeElapsed);
countDownTimer = new MalibuCountDownTimer(startTime, interval);
text.setText(text.getText() + String.valueOf(startTime));
}
@Override
public void onClick(View v) {
if (!timerHasStarted) {
countDownTimer.start();
timerHasStarted = true;
startB.setText("Start");
}
else {
countDownTimer.cancel();
timerHasStarted = false;
startB.setText("RESET");
}
}
// CountDownTimer class
public class MalibuCountDownTimer extends CountDownTimer {
public MalibuCountDownTimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish() {
text.setText("Time's up!");
timeElapsedView.setText("Time Elapsed: " +
String.valueOf(startTime));
}
@Override
public void onTick(long millisUntilFinished) {
text.setText("Time remain:" + millisUntilFinished);
timeElapsed = startTime - millisUntilFinished;
timeElapsedView.setText("Time Elapsed: " +
String.valueOf(timeElapsed));
}
}
}
Рис. 1. Сброс таймера
URL-адрес для загрузки исходного кода
Исходный код этого примера можно посмотреть и скачать на странице Github.