2011-04-05 47 views
1

我想创建一个位于后台的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) 

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

+0

尝试在InterruptedException之后放置另一个catch块,但让它捕获Exception并使用printStackTrace查看抛出的异常。 – Squonk 2011-04-05 20:35:04

+0

如果这是一个长期运行的任务,那么也许你应该使用服务。 – Intrications 2011-04-05 20:48:01

回答

1

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

+0

我该如何让服务睡眠? – Andrew 2011-04-05 22:43:52

+0

@Andrew你可以使用['Handler#postdelayed()'](http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,%20long%29)一个'Runnable' – 2011-04-05 23:17:43

+0

我对一件事有点困惑。 postDelayed需要一个Runnable(使用我的Web服务代码)和一个很长的时间(以毫秒为单位),这是从现在开始应该执行Runnable的时间。我的问题是,我希望这个无限期地发生X次,直到我停止服务。 – Andrew 2011-04-06 14:38:36

1

怎么样用Thread.sleep(15000)代替?或者你正在使用语义学的notify

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

+0

Thread.sleep似乎解决了问题 – Andrew 2011-04-05 20:52:46