ГлавнаяНеобходимые приложенияНастройка приложенийГлавный классВысокоуровневое программированиеНизкоуровневое программированиеФайл манифестаСохранения. Работа с RecordStoreРабота с таймеромПолезные ссылкиОб автореСайт ФПМиКТСтуденческий сайт
Сайт о Java ME

Работа с таймером

Для работы с таймером существует два связанных друг с другом класса - Timer и TimerTask.

Для начала создадим новый класс и назовем его MyTimer. Унаследуем его от TimerTask. Теперь нужно переопределить в нем абстрактный метод run. Он будет вызываться при наступлении нужного нам события.

Давайте, для определенности условимся, что по событию таймера будет перерисовываться экран и увеличиваться на единицу счетчик (мы будем рисовать экран с помощью класса GameCanvas, см. раздел низкоуровневое программирование). Для этого, переопределим конструктор данного класса, чтобы в параметре он принимал ссылку на объект того класса, с которым мы будем работать (в нашем случае, это Canva). Метод run будет вызывать метод перерисовки экрана и увеличивать на единицу счетчик. Вот как будет выглядеть класс целиком:

Файл MyTimer.java

package hello;

import java.util.TimerTask;

public class MyTimer extends TimerTask{
    
    Canva canva;
    
    MyTimer(Canva canva){
        this.canva=canva;
    }

    public void run() {
        canva.count++;
        canva.paint();
    }
}
Пример
Теперь этот таймер как-то нужно запустить. Перейдите в класс Canva и создайте новый объект класса MyTimer (я назвал его myTimer). Далее, создайте объект класса Timer (я назвал его timer). Теперь нужно вызвать один из методов schedule и вставить туда необходимые данные. Вот как выглядят различные методы schedule:
  • void schedule(TimerTask myTimer, Date date) - таймер myTimer срабатывает один раз при наступлении определенного момента времени, указанного в объекте класса date.
  • void schedule(TimerTask myTimer, long milisec) - таймер myTimer срабатывает один раз после определенного количества милисекунд, указанных параметром milisec.
  • void schedule(TimerTask myTimer, long milisec1, long milisec2) - таймер myTimer срабатывает после определенного количества милисекунд, указанных параметром milisec с периодом milisec2.
Остановка таймера заключается в вызове метода void cancel() класса TimerTask.

Если класс TimerTask остановлен, он не может быть запущен заново. Для того, чтобы его перезапустить, необходимо создать новый экземпляр данного класса (в нашем случае, напомню, это MyTimer).
Вот как выглядит оставшиеся классы программы:

Файл HelloMIDlet.java

package hello;

import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet{

    Canva canva;

    public HelloMIDlet() {
        canva=new Canva(this);
    }

    public void startApp() {
        canva.start();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        canva=null;
    }
}

Файл Canva.java

package hello;

import java.util.Timer;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Canva extends GameCanvas{

    Display myDisplay;
    int count=0;
    MyTimer myTimer;
    Timer timer;

    Canva(HelloMIDlet midlet){
        super(true);
        myDisplay=Display.getDisplay(midlet);
        myDisplay.setCurrent(this);
        setFullScreenMode(true);
        timer=new Timer(); //Создаем объект Timer
    }

    void start(){
		//Создаем объект MyTimer (обязателен перед новым вызовом метода schedule
        myTimer=new MyTimer(this);
		//Запускаем задачу через 1 секунду с периодом в 100 милисекунд
        timer.schedule(myTimer, 1000, 100);
    }

    void paint(){
        if(count>200){ //если count>200 останавливаем таймер и запускаем заново
            myTimer.cancel(); //останавливаем выполнение таймер
            start();
            count=0;
        }
        paint(getGraphics());
        flushGraphics();
    }

    public void paint(Graphics g){
        g.setColor(Integer.MAX_VALUE);
        g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
        g.setColor(0);
        g.drawString(count + "", 10, 10, 0);
    }
}
MobileApplication4.jad
MobileApplication4.jar

При срабатывании, таймер перехватывает исключения. Это значит, что если в момент работы метода run класса TimerTask произошла ошибка, то вы не увидите трассы стека.

Назад	Далее