2011-04-05 84 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