Главная » Используем Timer для выполнения запланированных задач через TimerTask | |
Для того, чтобы в фоновом режиме выполнить отчет времени, по истечению которого в вашем приложении должно произойти какое либо событие, можно использовать встроенный класс Timer и TimerTask. Сам класс Timer служит исключительно для отсчета времени, он может работать в двух режимах: одноразовое выполнение задания, либо же повторяющееся действие (например, напоминание, что у вас не лицензионная версия антивируса :). Метод TimerTask используется для описания действий, которые должны происходить по истечению времени отсчета в таймере Timer. То есть, здесь реализуется визуальное проявление работы таймера, иначе он просто будет считать себе в фоне и все без толку, никто о нем даже не узнает. Мы сделаем сначала совсем простую вещь - создадим приложение с таймером, которое по истечению времени в одну секунду будет высвечивать пользователю текущее время на аппарате, а потом попробуем усложнить задачу и выполнять с помощью таймера запуск второго activity. Создаем новый проект, выбираем Blank Activity. В файле activity_main.xml создаем интерфейс нашего приложения:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<CheckBox
android:id="@+id/single_shot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Один раз"/>
<Button
android:id="@+id/start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Запуск"/>
<Button
android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Остановить"/>
<TextView
android:id="@+id/count"
android:textSize="25dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
Теперь вся остальная работа будет происходить с помощью кода в MainActivity.java. Здесь мы выполняем стандартные шаги: объявляем используемые объекты, связываемся с элементами интерфейса. Ну и задаем Timer и метод для выполнения задачи по истечению таймера TimerTask:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import android.app.Activity;
public class MainActivity extends Activity {
// ОБъявляем используемые объекты:
CheckBox mCheck;
Button mStart, mStop;
TextView mCount;
Timer timer;
TimerTask mTimerTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Связываемся с элементами пользовательского интерфейса:
mCheck = (CheckBox)findViewById(R.id.single_shot);
mStart = (Button)findViewById(R.id.start);
mStop = (Button)findViewById(R.id.stop);
mCount = (TextView)findViewById(R.id.count);
// Настраиваем слушателя нажатий по кнопке "Старт":
mStart.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(timer != null){
timer.cancel();
}
// Задаем поведение таймера при включенном и выключенном переключателе,
// выполняем задачу MyTimerTask, описание которой будет ниже:
timer = new Timer();
mTimerTask = new MyTimerTask();
if(mCheck.isChecked()){
// Выполняем действие с задержкой 1 секунда:
timer.schedule(mTimerTask, 1000);
}else{
// После задержки одна секунда, повторяем действие таймера каждую секунду:
timer.schedule(mTimerTask, 1000, 1000);
}
}});
// Кнопка "Остановить" отменяет действие таймера:
mStop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if (timer!=null){timer.cancel();timer = null;
}
}
});
}
// Метод для описания того, что будет происходить при работе таймера (задача для таймера):
class MyTimerTask extends TimerTask {
@Override
public void run() {
// Берем дату и время с системного календаря:
Calendar calendar = Calendar.getInstance();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss a");
// Преобразуем информацию в строковые данные:
final String strDate = simpleDateFormat.format(calendar.getTime());
runOnUiThread(new Runnable(){
// Отображаем информацию в текстовом поле count:
@Override
public void run() {
mCount.setText(strDate);
}});
}
}
}
Вот так выполняется реализация системного Android Timer. Пробуем запустить и смотрим на результат: Теперь сделаем немного сложнее - при истечении 5 секунд в таймере будем запускать второе окно приложения. Как создать второе окно и выполнять на него переход мы уже детально разбирали раньше. Как вы уже поняли, все изменения будут касаться лишь времени таймера:
if(mCheck.isChecked()){
// Выполняем переход с задержкой 5 секунда:
timer.schedule(mTimerTask, 5000);
и описания действий в методе MyTimerTask:
// Выполняем переход на второй экран с помощью Intent:
class MyTimerTask extends TimerTask {
@Override
public void run() {
Intent intent = new Intent(MainActivity.this,Second.class);
startActivity(intent);
}
}
Запускаем и тестируем: Переход выполнен успешно! Как видите, Android Timer довольно простая и интересная вещь, теоретически в метод TimerTask можно запихнуть что угодно. Поэкспериментируйте! А еще освойте счетчик обратного отсчета CountDownTimer. | |
|
Всего комментариев: 1 | |
| |