0
private void startUpdateTimerTask() {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                doUpdate();

            }
        };

        Timer timer = new Timer(true);
        timer.schedule(task, ONE_MINUTE_MILLIS, ONE_HOUR_MILLIS);
    }

        private void doUpdate() { 
              new AsyncTask<Void,Void,Void>() {

            @Override
            protected Void doInBackground(Void... params) { 

                //....Network time-consuming tasks
                return null;
            }

        }.equals();

        }

(1)我的问题:当我运行这个函数时,会有RuntimeException(No Looper; Looper.prepare() was not called on this thread.);

所以我改变了:

private void startUpdateTimerTask() {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                         Looper.prepare();

                 doUpdate();

                         Looper.loop()

            }
        };

        Timer timer = new Timer(true);
        timer.schedule(task, ONE_MINUTE_MILLIS, ONE_HOUR_MILLIS);
    }

那么 RuntimeException 没有出现,但是 doUpdate() 只执行了一次?

(2)问题:如何实现上网1小时更新一次信息?

4

1 回答 1

0

那么 RuntimeException 没有出现,但是 doUpdate() 只执行了一次?

这是因为异步任务只能执行一次。doInBackground() 在单独的线程上运行,一旦一个线程完成了它的进程,就不能再次启动它。由于您已经在使用定时器任务,定时器任务在单独的工作线程上执行操作,因此您可以在定时器任务的 run() 中执行相同的操作,这与您在 AsyncTask 的 doInBackground() 中执行的操作相同。为了更新你的 UI,你可以使用 Runnable。

于 2012-12-25T02:34:45.907 回答