如何重新启动AsyncTask或避免RUNNING

时间:2010-09-24 08:49:49

标签: java android

我正在开发一个解析HTML数据的应用程序。解析的数据之一是一个随时间增加的整数,而不是不断地请求数据我希望有一个间隔整数的任务。由于我需要将值更新为TextView,我决定使用AsyncTask而不是Timer。

我的问题是,我希望能够重新启动我的任务,一旦我知道它已经完成,或者它当前正在运行,只是避免操纵它。

这是我的AsyncTask:

class TurnsUpdate extends AsyncTask<Void, Integer, Exception>
{
    protected void onPreExecute()
    {
        turns = Integer.parseInt(DATABASE.getValue("turns").replaceAll(" T", ""));
    }

    protected Exception doInBackground(Void...voids)
    {
        while (turns < maxTurns)
        {
            try
            {
                Thread.sleep(sleep);
            }
            catch (InterruptedException e)
            {
                return e;
            }

            turns++;
            publishProgress(turns);
        }
        return null;
    }

    protected void onProgressUpdate(Integer... turns)
    {
        infoTurns.setText(Integer.toString(turns[0]) + " T");
    }

    protected void onPostExecute(Exception e)
    {
        vibrator.vibrate(500);
    }
}

我尝试开始或避免:

  if ((HOME.updateTurns == null || HOME.updateTurns.getStatus() == AsyncTask.Status.FINISHED) && HOME.updateTurns.getStatus() != AsyncTask.Status.RUNNING)
    {
        HOME.updateTurns = (UpdateTurns) new UpdateTurns();
        HOME.updateTurns.execute();
    }

我是否正确地解决了这个问题?

2 个答案:

答案 0 :(得分:3)

您是否尝试过进行递归调用:

new UpdateTurns().execute() 
onPostExecute中的

?从技术上讲,它应该工作,因为onPostExecute中的任何代码都在UI线程上运行,而不是在AsyncTask中创建的线程。

答案 1 :(得分:1)

当我尝试在状态为FINISHED的AsyncTask上调用.execute()时,我一直遇到异常。我终于在API中找到了这一行:

  

该任务只能执行一次(如果尝试第二次执行则会抛出异常。)

来源:“{线程规则”下的http://developer.android.com/reference/android/os/AsyncTask.html