Используем Timer для выполнения запланированных задач через TimerTask
Главная » Используем 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.

Категория: Уроки программирования | Просмотров: 2378 | Добавил: Oleg | Теги: планировщик задач, Android Timer, TimerTask, timer, таймер задач | Рейтинг: 5.0/1
Всего комментариев: 1
avatar
1 Mangu100 • 16:29, 28.01.2016
Отлично всё получилось)Спасибо за ценный урок!
avatar