android 定时器 循环器


//全局唯一计时器 节省资源
public class TimeUtils {

    private static TimeUtils timeUtils;
    ArrayList<WeakReference<OnTimeCallListent>> listents = new ArrayList<>();


    private TimeUtils() {
        mHandler.postDelayed(r, 1000);//延时1000毫秒
    }

    public static synchronized TimeUtils newInstance() {
        if (timeUtils == null) {
            timeUtils = new TimeUtils();
        }
        return timeUtils;
    }

    //向计时器注册回调 无需手动释放 当回调被销毁自动释放 需要注意回调生命周期 匿名回调会被系统直接回收
    public void setCallBack(OnTimeCallListent onTimeCallListent) {
        WeakReference<OnTimeCallListent> weakReference = new WeakReference<>(onTimeCallListent);
        listents.add(weakReference);
    }

    public interface OnTimeCallListent {
        public void onTime(long time);
    }


    final Handler mHandler = new Handler();
    Runnable r = new Runnable() {

        @Override
        public void run() {
            ArrayList<WeakReference<OnTimeCallListent>> mList = new ArrayList<>();
            for (int i = 0; i < listents.size(); i++) {
                OnTimeCallListent listent = listents.get(i).get();
                if (listent != null) {
                    mList.add(listents.get(i));
                    try {
                        listent.onTime(getLongTime() / 1000);

                    }catch (Exception err){
                        LogUtil.e("倒计时出现错误");
                    }
                }
            }
            listents.clear();
            listents = mList;
            mHandler.postDelayed(this, 1000);
        }
    };

    public static Date getDate() {
        Date date = new Date(System.currentTimeMillis());
        return date;
    }

    public static long getLongTime() {
        long dateTime = getDate().getTime();
        return dateTime;
    }
}

使用时无需主动释放资源,采用弱引用持有回调对象,当回调对象被回收 主动释放不影响被持有对象生命周期,需注意 匿名回调会很容易被回收

使用方法 每隔一秒回调一次

TimeUtils.OnTimeCallListent onTimeCallListent = new TimeUtils.OnTimeCallListent() {
        @Override
        public void onTime(long time) {//单位秒
         

            }
        }
    };

TimeUtils.newInstance().setCallBack(onTimeCallListent);

猜你喜欢

转载自blog.csdn.net/qq_35644925/article/details/118967674