Я хотел бы создать 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)
Я не совсем уверен, что здесь происходит. Любые идеи?
Во-первых, это собирается убить вашу батарею. Во-вторых, если вы действительно хотите это сделать, вы должны использовать Service
, а не AsyncTask
. Последний предполагается использовать только для краткосрочных, одноразовых применений, а не для непрерывного фонового опроса.
Handler#postdelayed()
в Runnable
Как насчет использования Thread.sleep(15000)
вместо этого? Или вы используете семантику notify
?
Кроме того, есть ли запись "вызвана..." в logcat?