3

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

我做了一些研究并决定这将需要一个 AsyncTask 或一个单独的线程。为简单起见,我决定使用 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

在 ...

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

在 ...

4

2 回答 2

10

你让这种方式变得比它需要的更难。已经在它自己的线程上TimerTask运行,因此您不需要使用AsyncTask只需将要运行的代码放入TimerTask.run()方法中。

于 2011-05-25T15:04:57.817 回答
0

如果要从 OnPostExecute 方法更新 UI,则将 timertask 与 asynctask 一起使用存在严重限制。计时器在单独的线程中运行,因此您必须找到一种从主线程启动异步任务的方法。

于 2014-12-12T09:51:46.163 回答