我正在开发一个应用程序,要求它每隔x分钟上线并检查一些新数据。为防止繁重的网络和数据使用,任务应以固定速率运行,但这种解决方案的最佳使用方法是什么? Handler
或Timer
对象?
答案 0 :(得分:3)
使用Timer
有一些缺点另一方面,ScheduledThreadPoolExecutor
正确处理所有这些问题,并且使用Timer没有意义..有两种方法可以在你的情况下使用
scheduleAtFixedRate(...)
scheduleWithFixedDelay(..)
class LongRunningTask implements Runnable {
@Override
public void run() {
System.out.println("Hello world");
}
}
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
long period = 100; // the period between successive executions
exec.scheduleAtFixedRate(new LongRunningTask (), 0, duration, TimeUnit.MICROSECONDS);
long delay = 100; //the delay between the termination of one execution and the commencement of the next
exec.scheduleWithFixedDelay(new MyTask(), 0, duration, TimeUnit.MICROSECONDS);
要取消执行者,请使用此 - ScheduledFuture
// schedule long running task in 2 minutes:
ScheduledFuture scheduleFuture = exec.scheduleAtFixedRate(new MyTask(), 0, duration, TimeUnit.MICROSECONDS);
... ...
// At some point in the future, if you want to cancel scheduled task:
scheduleFuture.cancel(true);
答案 1 :(得分:0)
您应该使用服务和AlarmReceiver Like This 这就是他们的目的。如果您在活动中使用计时器或任何其他机制,并且您将数据设置为每隔“几分钟”更新一次,那么用户很可能不会在您的应用中,并且Android可能会很好地清理它,使您的应用不会更新。闹钟将一直亮着,直到设备关闭。
答案 2 :(得分:0)
如果您正在寻找良好的性能和更少的电池消耗,您应该考虑与Alarm manager
集成的broadcast Reciever
将在X时间内调用服务并让它完成工作然后将其关闭试。
但是,使用timer
或handler
时,您需要始终让您的服务在后台运行。除非,您希望它在应用程序运行时获取数据,因此您不需要服务。
如果您选择是handler
还是timer
,那么请使用计时器,因为它更简单,可以更好地完成工作。 handlers
通常用于使用Runnable
或Messeges
更新用户界面。
答案 3 :(得分:0)
可能是Alarm Manager,timer,handler或ScheduledThreadPoolExecutor。
看看这个:
Scheduling recurring task in Android
这取决于用户不在应用程序时是否会发生更新(例如,一旦用户离开发送短信,检查是否会停止,或者轮询是否会继续?)可以在UI上运行检查线程然后从服务或AsyncTask或其他线程产生加载?也许这一切都不重要......
答案 4 :(得分:0)
如果您在用户未查看应用时不需要更新任何内容,请使用计时器。服务将是一种矫枉过正。以下是实现此目的的示例代码:
final Runnable updateRunnable = new Runnable() {
public void run() {
// Fetch the date here in an async task
}
};
final Handler myHandler = new Handler();
private Timer myTimer;
private void updateUI() {
myHandler.post(updateRunnable);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ... other things here
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
updateUI(); // Here you can update the UI as well
}
}, 0, 10000); // 10000 is in miliseconds, this executes every 10 seconds
// ... more other things here
}
答案 5 :(得分:0)
警报管理器或处理程序。如果您使用handler和postDelayed,则您的流程不必始终保持活动状态。
事实上,官方建议使用Handler而不是Timer或TimerTask:http://android-developers.blogspot.ru/2007/11/stitch-in-time.html