假设我想每10秒执行一次操作,并不一定需要更新视图.
问题是:使用带有timertask的计时器是否更好(我的意思是更有效率和更有效),如下所示:
final Handler handler = new Handler();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
<some task>
}
});
}
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}
Run Code Online (Sandbox Code Playgroud)
或者只是一个带有postdelayed的处理程序
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
<some task>
}
};
handler.postDelayed(r, 15000);
Run Code Online (Sandbox Code Playgroud)
如果您能解释何时使用哪种方法以及为什么其中一种方法比另一种方法更有效(如果它实际上是这样),我将不胜感激.
我每天凌晨5点都在尝试完成某项任务.所以我决定使用ScheduledExecutorService
这个,但到目前为止,我已经看到了一些示例,显示了如何每隔几分钟运行一次任务.
而且我无法找到任何显示如何在早上的特定时间(早上5点)每天运行任务的例子,同时也考虑夏令时的事实 -
以下是我的代码,每15分钟运行一次 -
public class ScheduledTaskExample {
private final ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(1);
public void startScheduleTask() {
/**
* not using the taskHandle returned here, but it can be used to cancel
* the task, or check if it's done (for recurring tasks, that's not
* going to be very useful)
*/
final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(
new Runnable() {
public void run() {
try {
getDataFromDatabase();
}catch(Exception ex) {
ex.printStackTrace(); //or loggger would be …
Run Code Online (Sandbox Code Playgroud) 如何在一段时间间隔之后重复执行异步任务,就像Timer一样...实际上我正在开发一个应用程序,它会自动从服务器下载所有最新的未读问候语,为此我必须在修复后检查服务器的更新时间间隔....我知道可以通过计时器轻松完成,但我想使用异步任务,我认为对Android应用程序更有效.
每N毫秒调用一个函数最准确的方法是什么?
我使用Thread.sleep 修改了这个例子,它不是很准确.
我正在开发一个音乐应用程序,它将在给定的BPM上播放声音.我知道创建一个完全准确的节拍器是不可能的,我不需要 - 只是想找到最好的方法来做到这一点.
谢谢
我需要让我的RSS Feed阅读器每隔10分钟检查一次新帖子,然后在有新帖子的情况下解析它们.我还需要每分钟都更新UI.
我从不同的来源阅读和听到了不同的东西.我目前的理解是我可以ScheduledThreadPoolExecutor
用来制作两个预定的线程,其中一个需要Handler
更新UI.我不确定这些类或者最有效的使用方法TimerTask
.
我也很不确定在哪里制作这些的子类.一位朋友建议TimerTask
在FeedParser
课堂上扩展为内部课程以使其更简单.但是,要以这种方式实现它,我必须使用该run()
方法TimerTask
而不重写它,这意味着我不能简单地使用我需要的参数来运行需要的函数.
简而言之,为此安排任务的最佳方法是什么,我将在哪里实现这些?
android handler threadpool timertask scheduledexecutorservice
public Button stb;
static int cnt=0;
public ArrayList<RadioButton> Butgrp1 = new ArrayList<RadioButton>();
Timer myt;
TimerTask t;
stb.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
myt.mschedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Entering run");
Handler h=new Handler();
h.post(new Runnable() {
public void run() {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
Butgrp1.get(cnt).setChecked(true);
cnt=cnt+1;
if(cnt>4)
cnt=0;
if(cnt>0)
// Butgrp1.get(cnt-1).setChecked(false);
System.out.println(cnt);
}
});
}
});
//rg.getChildAt(cnt).setPressed(true);
} …
Run Code Online (Sandbox Code Playgroud) 正如您所知,您可以在Java 8中使用lambdas,例如替换匿名方法.
这里可以看到Java 7与Java 8的一个例子:
Runnable runnable = new Runnable() {
@Override
public void run() {
checkDirectory();
}
};
Run Code Online (Sandbox Code Playgroud)
在Java 8中可以表示为以下两种方式:
Runnable runnable = () -> checkDirectory();
Run Code Online (Sandbox Code Playgroud)
要么
Runnable runnable = this::checkDirectory;
Run Code Online (Sandbox Code Playgroud)
这是因为它Runnable
是一个功能接口,只有一个(抽象)公共非默认方法.
但是......因为TimerTask
我们有以下内容:
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
checkDirectory();
}
};
Run Code Online (Sandbox Code Playgroud)
看起来很熟悉吧?
使用lambda表达式不起作用,因为它TimerTask
是一个抽象类,即使它只有一个抽象的公共非默认方法,它也不是一个接口,因此也没有功能接口.
它也没有重构为具有默认实现的接口,因为它带有状态,因此无法完成.
所以我的问题:构建时有没有办法使用lambdas TimerTask
?
我想要的是以下内容:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
Run Code Online (Sandbox Code Playgroud)
而不是一些丑陋的匿名内部类,有没有办法让它更好?
我很难在Android上找到TimerTask函数的文档.我需要使用TimerTask间隔运行一个线程,但不知道如何去做.任何建议或例子将不胜感激.
这些方法(类)之间有什么区别?
我想运行一个每5秒运行一次的应用程序,当它完成时清除内存,以及当cpu处于待机模式时,你可以运行该应用程序.因此应用程序不受唤醒锁定.
问候,
沙夫卡特
我的Android应用程序中有一个动画,它会闪烁TextView不同的颜色.我使用了TimerTask,Timer和Runnable方法来实现它.我需要做的是在用户在onPause()期间离开应用程序时停止线程,并在用户返回onResume()中的应用程序时恢复线程.以下是我实现的代码,但它不起作用(onPause()和onResume()件),我不明白为什么.我已经阅读了其他类似问题的其他帖子,但他们没有帮我弄清楚在我的情况下该怎么做.我已经读过TimerTasks已经过时了,我应该使用ExecutorService方法; 我不清楚如何实现这个功能.
...timerStep5 = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (b5) {
cashButton2SignalText.setBackgroundColor(Color.RED);
cashButton2SignalText.setTextColor(Color.WHITE);
b5=false;
} else {
cashButton2SignalText.setBackgroundColor(Color.WHITE);
cashButton2SignalText.setTextColor(Color.RED);
b5=true;
}
}
});
}
};
timer5.schedule(timerStep5,250,250);
}
public void onPause(){
super.onPause();
timerStep5.cancel();
}
public void onResume(){
super.onResume();
timerStep5.run();
}
Run Code Online (Sandbox Code Playgroud)