我正在开发一个解析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();
}
我是否正确地解决了这个问题?
答案 0 :(得分:3)
您是否尝试过进行递归调用:
new UpdateTurns().execute()
onPostExecute中的?从技术上讲,它应该工作,因为onPostExecute中的任何代码都在UI线程上运行,而不是在AsyncTask中创建的线程。
答案 1 :(得分:1)
当我尝试在状态为FINISHED的AsyncTask上调用.execute()时,我一直遇到异常。我终于在API中找到了这一行:
该任务只能执行一次(如果尝试第二次执行则会抛出异常。)
来源:“{线程规则”下的http://developer.android.com/reference/android/os/AsyncTask.html