以下是我尝试做的事情:定期检查某个网站,解析XML并在满足某些条件时让手机振动。我有一个AsyncTask,我在其中声明了XmlPullParser
- 我查看了XML标签,一旦找到我感兴趣的标签,它会检查该值并使手机振动,如果该值在该范围内我希望它是;但是当我试图反复运行它时,我碰到了一个catch-22。
我正在查看this StackOverflow post并继续执行该功能,但现在发生了什么:
在onStart
我有一个startTimer
函数,如下所示:
private synchronized void startTimer(final Context context){
timer = new Timer();
TimerTask task = new TimerTask(){
@Override
public void run(){
executing.set(true);
functionThatExecutesAsyncTask();
}
};
timer.schedule(task, 01, updateFrequency);
}
我遇到的第一个问题是每次切换到应用程序(或翻转屏幕)时都会创建一个新计时器,每个计时器都在updateFrequency
上执行AsyncTask。在Threads调试窗口中还有五个AsyncTasks(全部列为" WAITING"),就像每个计时器创建一个新任务而不是同一个任务一样;令人惊讶的是,虽然我有超过5个计时器,但出于某种原因,我从未有超过5个任务。为了解决多个计时器的问题,我决定覆盖onStop
并摆脱现有的计时器(这也有助于我翻转手机并希望新计时器调用任务):
@Override
public void onStop() {
super.onStop();
if(timer != null) {
timer.cancel();
timer.purge();
timer = null;
}
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
AppIndex.AppIndexApi.end(client, getIndexApiAction());
client.disconnect();
}
这里的问题很明显:即使没有创建额外的计时器,我也没有任何东西让手机在定义的时间间隔内振动,因为当应用程序停止时,每个计时器都会被销毁。它也没有解决创建多个AsyncTasks的问题。
以下是问题:
在另一个StackOverflow帖子中,有人建议不要使用AsyncTask反复做事,而是使用线程代替,但这只是一个建议,而搜索"重复调用AsyncTask"产生了许多结果。 AsyncTask不适合在这里使用吗?
我怎样才能每次只调用一个AsyncTask,而不是五个?为什么有五个创建?
如何避免使用无限定时器或根本没有定时器?即使关闭屏幕并且手机位于我的口袋深处,我也非常希望应用程序能够不断更新。
答案 0 :(得分:1)
如果timer
为空,我们知道它还不存在,因此创建一个新的安全。在这些情况下,timer
为空:
if (timer == null) {
startTimer(this); }