Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set timer in android?

Tags:

android

timer

Can someone give a simple example of updating a textfield every second or so?

I want to make a flying ball and need to calculate/update the ball coordinates every second, that's why I need some sort of a timer.

I don't get anything from here.

like image 291
SERG Avatar asked Jan 04 '11 19:01

SERG


People also ask

What is timer in Android Studio?

A facility for threads to schedule tasks for future execution in a background thread. Tasks may be scheduled for one-time execution, or for repeated execution at regular intervals. Corresponding to each Timer object is a single background thread that is used to execute all of the timer's tasks, sequentially.


1 Answers

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");     }  }   
like image 58
Dave.B Avatar answered Nov 20 '22 08:11

Dave.B