android 定时器

本文介绍了一种避免内存泄露的Android定时器实现方式,通过封装Timer和TimerTask,结合WeakReference和Handler,确保在使用定时器时不会因内部类引用导致Activity无法正常释放。同时,定义了IXTimer接口,简化了使用者的代码。示例代码展示了如何创建和取消定时任务,以及在不同时间间隔执行任务。
摘要由CSDN通过智能技术生成

android 在实现定时器的方法很多,网上可以搜到很多,但是实现的时候一定要注意句柄导致的内存泄露问题。这里我们主要通过对Timer封装实现一个简易的定时器。

  1. 为了避免内部类导致的内存泄露,实现将TimerTaskHandler都放在类外部实现
  2. 为了方便使用,定义interface IXTimer,使用者从IXTimer派生即可使用定时器

为什么选用Timer?
因为Timer支持一个定时器设置多个TimerTask(通过堆实现,效率高),符合实际使用场景。不需要为每个定时器单独启用一个线程。

interface IXTimer{
    public final static String TAG ="ITimer";

    default void onTimer(int timerId){
        Log.i(TAG, String.format("ontimer id:%d", timerId));
    }
}

class XTimerHandle extends Handler{
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        Log.i("finalize","XTimerHandle::finalize");
    }
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);

        WeakReference<IXTimer> weakReference = (WeakReference<IXTimer>) msg.obj;
        IXTimer iTimer = weakReference.get();
        if(iTimer != null){
            iTimer.onTimer(msg.what);
        }
    }
};

class XTimerTask extends TimerTask{
    public XTimerTask(int timerId,WeakReference<IXTimer> refweak_timer,Handler timer_hander){
        m_timer_hander = new WeakReference<>(timer_hander);
        m_timerId = timerId;
        m_refweak_timer = refweak_timer;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        Log.i("finalize","XTimerTask::finalize");

    }

    @Override
    public void run() {
        Message msg = new Message();
        msg.obj = m_refweak_timer;
        msg.what = m_timerId;
        Handler handler = m_timer_hander.get();
        if(handler != null){
            handler.sendMessage(msg);
        }
    }

    private WeakReference<IXTimer> m_refweak_timer;
    private int m_timerId;
    private WeakReference<Handler> m_timer_hander;
}

public class XTimer {
    public final static String TAG ="XTimer";

    private WeakReference<IXTimer> m_refweak_timer;
    public XTimer(IXTimer iTimer){
        m_refweak_timer = new WeakReference<>(iTimer);
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        Log.i("finalize","XTimer::finalize");
        m_map_timertask.clear();
        m_timer.cancel();
        m_timer = null;
        m_timer_hander.removeCallbacksAndMessages(null);
        m_timer_hander = null;
    }

    public void setTimer(int timerId, int time){
        if(m_map_timertask.containsKey(timerId))
        {
            //取消当前定时器
            m_map_timertask.get(timerId).cancel();
        }
        TimerTask timerTask = new XTimerTask(timerId,m_refweak_timer,m_timer_hander);
        m_map_timertask.put(timerId,timerTask);
        m_timer.schedule(timerTask,time,time);
    }

    public void killTimer(int timerId){
        if(m_map_timertask.containsKey(timerId)){
            m_map_timertask.get(timerId).cancel();
            m_map_timertask.remove(timerId);
        }
    }

    private HashMap<Integer,TimerTask> m_map_timertask = new HashMap<>();
    private Timer m_timer = new Timer();
    private Handler m_timer_hander = new XTimerHandle();
}

使用

class CA implements IXTimer{
    private XTimer m_timer = new XTimer(this);

    public CA(){
        m_timer.setTimer(0x12,1000);
        m_timer.setTimer(0x13,15000);
    }
    @Override
    public void onTimer(int timerId) {
       Log.i("onTimer","onTimer");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值