在我的计划中,我想检查一个新版本(从HTTP
获取数据)
该功能完美运行,但我想让它每隔X运行一次(可配置,一小时,一天等)。
所以我写了这段代码:
Timer mTimer1 = new Timer();
PowerManager pm = (PowerManager) this.main.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = this.pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, MainActivity.PROGRAM);
PowerManager.WakeLock wl.acquire();
TimerTask mTt1 = new TimerTask()
{
public void run()
{
mTimerHandler.post(new Runnable()
{
public void run()
{
// Do the check...
}
});
}
};
(因为这个函数是在一个单独的类中,而不是从Activity
派生的,所以我将父类this.main
传递给构造函数,这样我就可以调用getSystemService
。{{1声明为Variable
)
好吧,当我启动private MainActivity main
它检查新版本,然后,一小时后(所以我的设置),我检查Timer
,我看到线程没有运行... < / p>
我在互联网上搜索,我发现,我必须使用Logs
,我这样做......
任何想法,为什么我有这个问题?
非常感谢! Luca Bertoncello
答案 0 :(得分:0)
Here is a SO answer that can help you with this使用处理程序和postDelayed()。
但是,如果你想在应用程序未打开时运行它,那么你需要使用AlarmManger。你创建一个PendingIntent
并创建一个Calendar
实例设置您要检查的时间,然后使用setRepeating()
上的AlarmManger
。即使不在应用程序中,也可以检查。您也可以在manifest
注册Boot_Completed
,以便在设备关闭后重启后再次开始运行
答案 1 :(得分:0)
如果您使用的是计时器,您还记得安排TimerTask吗?
尝试
mTimer1.schedule(mTt1, delay, interval);
如果你想阻止它,请mTimer1.cancel();
和mTimer1.purge();
清除计划队列。
答案 2 :(得分:0)
使用此代码
Timer timer = new Timer();
timer.scheduleAtFixedRate(
new java.util.TimerTask() {
@Override
public void run() {
// Your code
}},
1000, 5000
);
如果 1000 是延迟时间,如果您想第一次延迟,如果您不想要,请将其设置为 0
5000 是一个迭代时间
答案 3 :(得分:0)
当手机进入睡眠状态时,您的活动将暂停执行,因此您的计时器将永远不会启动。使用PARTIAL_WAKE_LOCK
可能不是一个好主意,因为它会在手机整个睡眠时耗电。
我建议您查看AlarmManager,特别是setInexactRepeating