2010-09-24 52 views
2

我正在开发一个应用程序,用于解析HTML中的数据。其中一个被解析的数据是一个随时间增加的整数,而不是不断请求数据,我希望有一个间隔整数的任务。由于我需要将值更新到TextView中,我决定使用AsyncTask而不是定时器。如何重新启动AsyncTask或避免运行

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

这里是我的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(); 
    } 

我要对这个正确?

+0

我使用TurnsUpdate创建了自己的公共类,并使infoTurns成为受保护的参考,从而解决了这个问题。据我所知,这一切都可以工作。 – 2010-09-24 20:06:42

+0

我说得太快了。我在完成完成后重新启动AsyncTask仍然有问题,或者在运行时避免它。 – 2010-09-24 20:33:09

回答

3

您是否尝试过只是让一个递归调用:

new UpdateTurns().execute() 
在onPostExecute

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

+0

那实际上工作。谢谢。 – 2010-09-25 00:04:06

1

当试图在状态为FINISHED的AsyncTask上调用.execute()时,我不断收到异常。我终于找到了这条线在API中:

任务只能执行一次(如果第二试图执行一个异常将被抛出。)

来源:http://developer.android.com/reference/android/os/AsyncTask.html下的“穿透规则”

+0

我从事这个项目已经有一段时间了,但如果我没有记错的话,我总是会创建一个新的AsyncTask来避免这个问题。 – 2012-02-23 07:11:24