How to set timer in android? How to set timer in android? android android

How to set timer in android?


ok since this isn't cleared up yet there are 3 simple ways to handle this.Below is an example showing all 3 and at the bottom is an example showing just the method I believe is preferable. Also remember to clean up your tasks in onPause, saving state if necessary.

import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Handler.Callback;import android.view.View;import android.widget.Button;import android.widget.TextView;public class main extends Activity {    TextView text, text2, text3;    long starttime = 0;    //this  posts a message to the main thread from our timertask    //and updates the textfield   final Handler h = new Handler(new Callback() {        @Override        public boolean handleMessage(Message msg) {           long millis = System.currentTimeMillis() - starttime;           int seconds = (int) (millis / 1000);           int minutes = seconds / 60;           seconds     = seconds % 60;           text.setText(String.format("%d:%02d", minutes, seconds));            return false;        }    });   //runs without timer be reposting self   Handler h2 = new Handler();   Runnable run = new Runnable() {        @Override        public void run() {           long millis = System.currentTimeMillis() - starttime;           int seconds = (int) (millis / 1000);           int minutes = seconds / 60;           seconds     = seconds % 60;           text3.setText(String.format("%d:%02d", minutes, seconds));           h2.postDelayed(this, 500);        }    };   //tells handler to send a message   class firstTask extends TimerTask {        @Override        public void run() {            h.sendEmptyMessage(0);        }   };   //tells activity to run on ui thread   class secondTask extends TimerTask {        @Override        public void run() {            main.this.runOnUiThread(new Runnable() {                @Override                public void run() {                   long millis = System.currentTimeMillis() - starttime;                   int seconds = (int) (millis / 1000);                   int minutes = seconds / 60;                   seconds     = seconds % 60;                   text2.setText(String.format("%d:%02d", minutes, seconds));                }            });        }   };   Timer timer = new Timer();    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        text = (TextView)findViewById(R.id.text);        text2 = (TextView)findViewById(R.id.text2);        text3 = (TextView)findViewById(R.id.text3);        Button b = (Button)findViewById(R.id.button);        b.setText("start");        b.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Button b = (Button)v;                if(b.getText().equals("stop")){                    timer.cancel();                    timer.purge();                    h2.removeCallbacks(run);                    b.setText("start");                }else{                    starttime = System.currentTimeMillis();                    timer = new Timer();                    timer.schedule(new firstTask(), 0,500);                    timer.schedule(new secondTask(),  0,500);                    h2.postDelayed(run, 0);                    b.setText("stop");                }            }        });    }    @Override    public void onPause() {        super.onPause();        timer.cancel();        timer.purge();        h2.removeCallbacks(run);        Button b = (Button)findViewById(R.id.button);        b.setText("start");    }}

the main thing to remember is that the UI can only be modified from the main ui thread so use a handler or activity.runOnUIThread(Runnable r);

Here is what I consider to be the preferred method.

import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.widget.Button;import android.widget.TextView;public class TestActivity extends Activity {    TextView timerTextView;    long startTime = 0;    //runs without a timer by reposting this handler at the end of the runnable    Handler timerHandler = new Handler();    Runnable timerRunnable = new Runnable() {        @Override        public void run() {            long millis = System.currentTimeMillis() - startTime;            int seconds = (int) (millis / 1000);            int minutes = seconds / 60;            seconds = seconds % 60;            timerTextView.setText(String.format("%d:%02d", minutes, seconds));            timerHandler.postDelayed(this, 500);        }    };    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.test_activity);        timerTextView = (TextView) findViewById(R.id.timerTextView);        Button b = (Button) findViewById(R.id.button);        b.setText("start");        b.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Button b = (Button) v;                if (b.getText().equals("stop")) {                    timerHandler.removeCallbacks(timerRunnable);                    b.setText("start");                } else {                    startTime = System.currentTimeMillis();                    timerHandler.postDelayed(timerRunnable, 0);                    b.setText("stop");                }            }        });    }  @Override    public void onPause() {        super.onPause();        timerHandler.removeCallbacks(timerRunnable);        Button b = (Button)findViewById(R.id.button);        b.setText("start");    }}


It is simple!You create new timer.

Timer timer = new Timer();

Then you extend the timer task

class UpdateBallTask extends TimerTask {   Ball myBall;   public void run() {       //calculate the new position of myBall   }}

And then add the new task to the Timer with some update interval

final int FPS = 40;TimerTask updateBall = new UpdateBallTask();timer.scheduleAtFixedRate(updateBall, 0, 1000/FPS);

Disclaimer: This is not the ideal solution. This is solution using the Timer class (as asked by OP). In Android SDK, it is recommended to use the Handler class (there is example in the accepted answer).


If you also need to run your code on UI thread (and not on timer thread), take a look on the blog: http://steve.odyfamily.com/?p=12

public class myActivity extends Activity {private Timer myTimer;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle icicle) {    super.onCreate(icicle);    setContentView(R.layout.main);    myTimer = new Timer();    myTimer.schedule(new TimerTask() {                  @Override        public void run() {            TimerMethod();        }    }, 0, 1000);}private void TimerMethod(){    //This method is called directly by the timer    //and runs in the same thread as the timer.    //We call the method that will work with the UI    //through the runOnUiThread method.    this.runOnUiThread(Timer_Tick);}private Runnable Timer_Tick = new Runnable() {    public void run() {    //This method runs in the same thread as the UI.                   //Do something to the UI thread here    }};}