我正在尝试在指定的时间(即每隔几秒钟)异步重复执行任务(即从文本文件加载数据),尽管此速率可能会在运行时发生变化)。
我做了一些研究并决定这需要AsyncTask或单独的Thread。为了简单起见,我决定使用AsyncTask。
我现在需要根据重复的计时器计划执行此AsyncTask。我相信我必须使用Timer和TimerTask。
以下代码是我想要实现的简单形式。当我尝试使用Android模拟器(通过Eclipse IDE)运行此代码时,我收到以下消息:“抱歉!应用程序意外停止。请再试一次。”
我想知道问题出在哪里以及如何解决问题。谢谢!
public class Sample extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SimpleTimerTask myTimerTask = new SimpleTimerTask();
long delay = 0;
long period = 5000;
Timer myTimer = new Timer();
myTimer.schedule(myTimerTask, delay, period);
}
private class SimpleAsyncTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
return null;
}
}
private class SimpleTimerTask extends TimerTask {
public void run() {
new SimpleAsyncTask().execute();
}
}
}
编辑:以下是似乎相关的LogCat消息
致命异常:Timer-0
java.lang.ExceptionInInitializerError
at ...
引起:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
at ...
答案 0 :(得分:10)
你这样做比你需要的更难。 TimerTask
已在其自己的线程上运行,因此您无需使用AsyncTask
只需将要运行的代码放在TimerTask.run()
方法中。
答案 1 :(得分:0)
如果要从OnPostExecute方法更新UI,则使用asynctask的timertask存在严重的限制。计时器在单独的线程中运行,因此您必须找到一种从主线程启动asynctask的方法。