Android定时器

395 阅读1分钟

1. 用handler+timer+timeTask方法:

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    //do something
                }
                super.handleMessage(msg);
            }
        };

        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);
            }
        };

         //主线程中调用:
        timer.schedule(timerTask, 1000, 500);//延时1s,每隔500毫秒执行一次run方法
        
        
        // 最后需要在满足一定条件后执行 timer.cancel(), timer == null, 防止内存泄漏

2. timer+timeTask+handler.post

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        MyApplication.getUiHandler().post(new Runnable() {
            @Override
            public void run() {
                // do something
            }
        });
    }
}, 0, 1000);

// 最后需要在满足一定条件后执行 timer.cancel(), timer == null, 防止内存泄漏

3. 使用线程池

ScheduledFuture<*>? mFuture = Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay({
    ViewUtils.runOnUiThread { 
    // do something
    }
}, 1000, 1000, TimeUnit.MILLISECONDS)

// 最后记得销毁

mFuture?.run {
    if (!isCancelled) cancel(true)
    null
}

4. 使用Observable.interval

Observable.interval(CHECK_STATE_CODE_TIME, TimeUnit.MILLISECONDS)
        .compose(RxUtil.ioThreadToMainThread())
        .subscribe(object : Observer<Long> {
            override fun onSubscribe(d: Disposable) {
            }

            override fun onNext(t: Long) {
                // do something
            }

            override fun onError(e: Throwable) {

            }

            override fun onComplete() {

            }
        })

5. 使用线程池

val scheduledExecutorService = Executors.newScheduledThreadPool(10)
scheduledExecutorService.schedule({
}, 200, TimeUnit.MILLISECONDS)

image.png