Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-每单位时间执行一次操作_Java_Android_Timer - Fatal编程技术网

Java Android-每单位时间执行一次操作

Java Android-每单位时间执行一次操作,java,android,timer,Java,Android,Timer,这与其说是无能,不如说是无知。我正在尝试构建一个计时器应用程序,但是发现CountDownTimer对象对于我来说太不准确了。因此,我想手动创建计时器,只需在每个时间单位上打勾并对每个打勾执行某种操作(无需倒计时,因为我将手动处理此操作)-是否有内置对象来执行此操作(除了倒计时),或者我必须使用线程/休眠吗?使用处理程序和postDelayed()方法。准确且易于使用。您只需在每次循环后不断地放入回调,但这并不太繁重,并且允许您根据需要调整间隔 Handler timeThing = new H

这与其说是无能,不如说是无知。我正在尝试构建一个计时器应用程序,但是发现CountDownTimer对象对于我来说太不准确了。因此,我想手动创建计时器,只需在每个时间单位上打勾并对每个打勾执行某种操作(无需倒计时,因为我将手动处理此操作)-是否有内置对象来执行此操作(除了倒计时),或者我必须使用线程/休眠吗?

使用
处理程序和
postDelayed()
方法。准确且易于使用。您只需在每次循环后不断地放入回调,但这并不太繁重,并且允许您根据需要调整间隔

Handler timeThing = new Handler();    
Runnable timedWorker = new Runnable {
    public void run(){
        // Do work
        timeThing.postDelayed(this, 10000); // do it again later
    }
};
timeThing.postDelayed(timedWorker, 10000);

使用
AsyncTask
Thread.sleep()

AsyncTask task=new AsyncTask(){
@凌驾
受保护的Void doInBackground(Void…参数){
而(!isCancelled()){
试一试{
睡眠(1000);
出版进度();
}捕捉(中断异常e){
打破
}
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
//在这里做点什么
}
};
//task.execute();开始
//task.cancel();制止

您的
onProgressUpdate()
将每N秒(本例中为1000秒)调用一次。

AsyncTasks
并不打算长时间执行。执行器池是有限的,只要循环在运行,它就会占用一个插槽。
Handler
解决方案使用主操作系统活套,它不易受到调度程序突发奇想的影响,也不会占用其他资源。
AsyncTask task=new AsyncTask<Void,Void,Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        while (!isCancelled()) {
            try {
                Thread.sleep(1000);
                publishProgress();
            } catch (InterruptedException e) {
                break;
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        //do something here    
    }
};
//task.execute(); to start
//task.cancel(); to stop