【问题标题】:android thinking: AsyncTask in TimerTaskandroid思考:TimerTask中的AsyncTask
【发布时间】:2012-12-25 02:00:40
【问题描述】:
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小时更新一次信息?

【问题讨论】:

  • "问题:如何实现访问网络每1小时更新一次信息?" - 看看使用IntentService触发的重复警报使用AlarmManager .
  • 你必须使用runOnUiThreadstackoverflow.com/questions/10135353/…

标签: android


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2020-08-28
    • 1970-01-01
    • 2011-09-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多