创建循环后台任务

时间:2011-04-05 20:17:59

标签: android android-asynctask

我想创建一个位于后台的AsyncTask,每隔X秒调用一次Web服务。

    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)

我不太确定这里发生了什么。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用Thread.sleep(15000)怎么样?或者您正在使用notify语义?

另外,logcat中是否还有“由......引起”的条目?

答案 1 :(得分:1)

首先,这会杀死你的电池。其次,如果你真的想要这样做,你应该使用Service而不是AsyncTask。后者仅用于短期一次性使用,而不是用于连续背景轮询。