Создание циклического фонового задания

1

Я хотел бы создать AsyncTask, который сидит в фоновом режиме и вызывает веб-службу каждые X секунд.

    private class BackgroundTask extends AsyncTask<Integer, Integer, Boolean> {
    protected Boolean doInBackground(Integer... params) {
        if (params.length > 0) {
            int intUserId = params[0];

            if (intUserId != -1) {
                boolean blnRunning = true;
                while (blnRunning) {
                    // perform query

                    try {
                        this.wait(15000);
                    }
                    catch (InterruptedException e) {
                        blnRunning = false;
                    }
                }
            }
        }

        return false;
    }

    protected void onPostExecute(Boolean blnLaunchStoreFavorites) {
        // do something?
    }
}

Это то, что у меня есть.

Вскоре после вызова this.wait() я получаю сообщение об ошибке в недрах ThreadPoolExecuter.class.

Uncaught handler: thread AsyncTask #2 exiting due to uncaught exception
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)

Я не совсем уверен, что здесь происходит. Любые идеи?

  • 0
    Попробуйте поместить другой блок catch после блока для InterruptedException, но пусть он перехватит Exception, а затем используйте printStackTrace, чтобы увидеть, какое исключение выдается.
  • 0
    Если это длительная задача, возможно, вам следует использовать Сервис.
Теги:
android-asynctask

2 ответа

1
Лучший ответ

Во-первых, это собирается убить вашу батарею. Во-вторых, если вы действительно хотите это сделать, вы должны использовать Service, а не AsyncTask. Последний предполагается использовать только для краткосрочных, одноразовых применений, а не для непрерывного фонового опроса.

  • 0
    Как бы я заснул в Сервисе?
  • 0
    @ Andrew, вы можете использовать Handler#postdelayed() в Runnable
Показать ещё 5 комментариев
1

Как насчет использования Thread.sleep(15000) вместо этого? Или вы используете семантику notify?

Кроме того, есть ли запись "вызвана..." в logcat?

  • 0
    Кажется, Thread.sleep решает проблему

Ещё вопросы

Сообщество Overcoder
Наверх
Меню