重复调用相同的AsyncTask

时间:2017-01-22 18:57:58

标签: android android-asynctask

以下是我尝试做的事情:定期检查某个网站,解析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,而不是五个?为什么有五个创建?

  • 如何避免使用无限定时器或根本没有定时器?即使关闭屏幕并且手机位于我的口袋深处,我也非常希望应用程序能够不断更新。

1 个答案:

答案 0 :(得分:1)

如果timer为空,我们知道它还不存在,因此创建一个新的安全。在这些情况下,timer为空:

  • 您的应用已开始"新鲜"
  • 你的应用程序被android破坏了,因为它在一段时间内处于空闲状态(在后台)。

if (timer == null) {     startTimer(this); }