lisovaccaro
lisovaccaro

Reputation: 33946

Use timertask to update clock each X seconds?

I'm trying to update my digital clock using timertask. I have created a function called updateClock() which sets the hours and minutes to the current time but I haven't been able to get it to run periodically. From what I've read in other answers one of the best options is to use timertask however I haven't been able to make any example I found online work inside an Android activity.

This is what I've written so far:

public class MainActivity extends Activity {
    TextView hours;
    TextView minutes;
    Calendar c;
    int cur_hours;
    int cur_minutes;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.clock_home);
        hours = (TextView) findViewById(R.id.hours);
        minutes = (TextView) findViewById(R.id.minutes);
        updateClock();
        }

    public void updateClock() {
        c = Calendar.getInstance();
        hours.setText("" + c.get(Calendar.HOUR));
        minutes.setText("" + c.get(Calendar.MINUTE));
        }

    public static void init() throws Exception {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                    updateClock(); // ERROR
                }
            }, 0, 1 * 5000);
        }
    }

How can I make it work?

Upvotes: 0

Views: 322

Answers (3)

Henry
Henry

Reputation: 43728

if you just need updates every minute, you can also listen to the ACTION_TIME_TICK broadcast event.

private boolean timeReceiverAttached;
private final BroadcastReceiver timeReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateClock();
    }
};
private Handler handler = new Handler();

@Override
protected void onResume() {
    super.onResume();
    updateClock();
    if (!timeReceiverAttached) {
        timeReceiverAttached = true;
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_TIME_TICK);
        filter.addAction(Intent.ACTION_TIME_CHANGED);
        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        registerReceiver(timeReceiver, filter, null, handler);
    }
}

@Override
protected void onPause() {
    super.onPause();
    if (timeReceiverAttached) {
        unregisterReceiver(timeReceiver);
        timeReceiverAttached = false;
    }
}

Upvotes: 0

s.d
s.d

Reputation: 29436

OR, periodically post the Runnable to the Handler of UI thread. Also, pause and resume tasks to save battery.

public class MyActivity extends Activity {
    private final Handler mHandler = new Handler();
    private final Timer mTimer = new Timer();

    @Override
    protected void onResume() {
        super.onResume();

        mTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        //---update UI---
                    }
                });
            }
        },0,5000);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mTimer.cancel();
    }
}

Upvotes: 0

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132972

Use runOnUiThread for updating Ui from Timer Thread

timer.scheduleAtFixedRate(new TimerTask() {
     public void run() {
      MainActivity.this.runOnUiThread (new Runnable() { 
         public void run() {
             updateClock(); // call UI update method here
         }
     }));  
   }
 }, 0, 1 * 5000);
}

Upvotes: 1

Related Questions