如何实现执行AsyncTask的Timer/TimerTask?(安卓系统)



我试图在指定的时间(即每隔几秒钟,尽管这个速率可能会在运行时发生变化)异步重复地执行任务(即从文本文件加载数据)。

我已经做了一些研究,并决定这将需要一个AsyncTask或一个单独的线程。为了简单起见,我决定使用AsyncTask。

我现在需要根据一个重复的计时器时间表来执行这个AsyncTask。我认为我必须使用计时器和计时器任务。

下面的代码是我试图实现的一个简单形式。当我尝试使用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消息

致命异常:计时器-0

java.lang.ExceptionInInitializerError

在。。。

引起原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序

在。。。

您正在使这种方式变得更加困难。TimerTask已经在自己的线程上运行,所以您不需要使用AsyncTask,只需将要运行的代码放在TimerTask.run()方法中即可。

如果您想从OnPostExecute方法更新UI,那么在asynctask中使用timertask有一个严重的限制。计时器在单独的线程中运行,所以您必须找到从主线程启动异步任务的方法。

最新更新