How to set timer in android?

后端 未结 21 1244
渐次进展
渐次进展 2020-11-22 00:51

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 se

21条回答
  •  轮回少年
    2020-11-22 01:37

    If anyone is interested, I started playing around with creating a standard object to run on an activities UI thread. Seems to work ok. Comments welcome. I'd love this to be available on the layout designer as a component to drag onto an Activity. Can't believe something like that doesn't already exist.

    package com.example.util.timer;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    import android.app.Activity;
    
    public class ActivityTimer {
    
        private Activity m_Activity;
        private boolean m_Enabled;
        private Timer m_Timer;
        private long m_Delay;
        private long m_Period;
        private ActivityTimerListener m_Listener;
        private ActivityTimer _self;
        private boolean m_FireOnce;
    
        public ActivityTimer() {
            m_Delay = 0;
            m_Period = 100;
            m_Listener = null;
            m_FireOnce = false;
            _self = this;
        }
    
        public boolean isEnabled() {
            return m_Enabled;
        }
    
        public void setEnabled(boolean enabled) {
            if (m_Enabled == enabled)
                return;
    
            // Disable any existing timer before we enable a new one
            Disable();
    
            if (enabled) {
                Enable();
            }
        }
    
        private void Enable() {
            if (m_Enabled)
                return;
    
            m_Enabled = true;
    
            m_Timer = new Timer();
            if (m_FireOnce) {
                m_Timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        OnTick();
                    }
                }, m_Delay);
            } else {
                m_Timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        OnTick();
                    }
                }, m_Delay, m_Period);
            }
        }
    
        private void Disable() {
            if (!m_Enabled)
                return;
    
            m_Enabled = false;
    
            if (m_Timer == null)
                return;
    
            m_Timer.cancel();
            m_Timer.purge();
            m_Timer = null;
        }
    
        private void OnTick() {
            if (m_Activity != null && m_Listener != null) {
                m_Activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        m_Listener.OnTimerTick(m_Activity, _self);
                    }
                });
            }
            if (m_FireOnce)
                Disable();
        }
    
        public long getDelay() {
            return m_Delay;
        }
    
        public void setDelay(long delay) {
            m_Delay = delay;
        }
    
        public long getPeriod() {
            return m_Period;
        }
    
        public void setPeriod(long period) {
            if (m_Period == period)
                return;
            m_Period = period;
        }
    
        public Activity getActivity() {
            return m_Activity;
        }
    
        public void setActivity(Activity activity) {
            if (m_Activity == activity)
                return;
            m_Activity = activity;
        }
    
        public ActivityTimerListener getActionListener() {
            return m_Listener;
        }
    
        public void setActionListener(ActivityTimerListener listener) {
            m_Listener = listener;
        }
    
        public void start() {
            if (m_Enabled)
                return;
            Enable();
        }
    
        public boolean isFireOnlyOnce() {
            return m_FireOnce;
        }
    
        public void setFireOnlyOnce(boolean fireOnce) {
            m_FireOnce = fireOnce;
        }
    }
    

    In the activity, I have this onStart:

    @Override
    protected void onStart() {
        super.onStart();
    
        m_Timer = new ActivityTimer();
        m_Timer.setFireOnlyOnce(true);
        m_Timer.setActivity(this);
        m_Timer.setActionListener(this);
        m_Timer.setDelay(3000);
        m_Timer.start();
    }
    

提交回复
热议问题