Java tutorial
/* J2ME in a Nutshell By Kim Topley ISBN: 0-596-00253-X */ import java.util.Timer; import java.util.TimerTask; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class ExampleMIDlet extends MIDlet { // Flag to indicate first call to startApp private boolean started = false; // Background thread private Thread thread; // Timer interval private int timerInterval; // Timer private Timer timer; // Task to run via the timer private TimerTask task; // Required public constructor. Can be // omitted if nothing to do and no other // constructors are created. public ExampleMIDlet() { System.out.println("Constructor executed"); // Get the timer interval from the // manifest or JAD file. String interval = getAppProperty("Timer-Interval"); timerInterval = Integer.parseInt(interval); System.out.println("Timer interval is " + interval); } protected void startApp() throws MIDletStateChangeException { if (!started) { // First invocation. Create and start // a timer. started = true; System.out.println("startApp called for the first time"); startTimer(); } else { // Resumed after pausing. System.out.println("startApp called following pause"); } // In all cases, start a background thread. synchronized (this) { if (thread == null) { thread = new Thread() { public void run() { System.out.println("Thread running"); while (thread == this) { try { Thread.sleep(1000); System.out.println("Thread still active"); } catch (InterruptedException ex) { } } System.out.println("Thread terminating"); } }; } } thread.start(); } protected void pauseApp() { // Called from the timer task to // do whatever is necessary to // pause the MIDlet. // Tell the background thread to stop. System.out.println("pauseApp called."); synchronized (this) { if (thread != null) { thread = null; } } } protected void destroyApp(boolean unconditional) throws MIDletStateChangeException { // Called to destroy the MIDlet. System.out.println("destroyApp called - unconditional = " + unconditional); if (thread != null) { Thread bgThread = thread; thread = null; // Signal thread to die try { bgThread.join(); } catch (InterruptedException ex) { } } stopTimer(); } // Starts a timer to run a simple task private void startTimer() { // Create a task to be run task = new TimerTask() { private boolean isPaused; private int count; public void run() { // Pause or resume the MIDlet. System.out.println("Timer scheduled"); if (count++ == 4) { // Terminate the MIDlet try { ExampleMIDlet.this.destroyApp(true); } catch (MIDletStateChangeException ex) { // Ignore pleas for mercy! } ExampleMIDlet.this.notifyDestroyed(); return; } if (isPaused) { System.out.println(">> Resuming MIDlet"); ExampleMIDlet.this.resumeRequest(); isPaused = false; } else { System.out.println(">> Pausing MIDlet"); isPaused = true; ExampleMIDlet.this.pauseApp(); ExampleMIDlet.this.notifyPaused(); } } }; // Create a timer and schedule it to run timer = new Timer(); timer.schedule(task, timerInterval, timerInterval); System.out.println("Timer started."); } // Stops the timer private void stopTimer() { if (timer != null) { System.out.println("Stopping the timer"); timer.cancel(); } } }