2011-02-08 4 views
1

У меня есть пользовательский AsyncTask (ListDownloadTask), который загружает данные и обновляет пользовательский интерфейс. Я хочу сделать это навсегда, пока активность будет открыта. Поэтому после того, как AsyncTask выполнил эту работу, она должна быть запланирована. Между попытками существуют задержки.Looping AsyncTask

Я попытался использовать таймер, но проблема new ListDownloadTask().execute(); должна быть вызвана из потока пользовательского интерфейса.

Теперь у меня есть таймер, который генерирует сообщение для Handler. Это кажется мне уродливым. Что такое лучшая практика?

@Override 
public void onCreate(Bundle savedInstanceState) { 
// ... 
    new ListDownloadTask().execute(); 
} 

private static final long DOWNLOAD_UPDATES_DELAY = 5 * 1000; 
private final Timer mUpdatesDownloaderTimer = new Timer(true); 

Handler mDownloadTrigger = new Handler(new Handler.Callback() { 
    public boolean handleMessage(Message message) { 
     new ListDownloadTask().execute(); 
     return true; 
    } 
}); 

private void scheduleUpdatesDownload() { 
    mUpdatesDownloaderTimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      mDownloadTrigger.sendEmptyMessage(0); 
     } 
    }, DOWNLOAD_UPDATES_DELAY); 
} 

private class ListDownloadTask extends AsyncTask<Long, String, Integer> { 
    @Override 
    protected void onPostExecute(Integer result) { 
     //... 
     scheduleUpdatesDownload(); 
    } 
+0

Спасибо за ответы. Я должен использовать сервис с самого начала. – Dmitry

ответ

0

Отъезд example Это похоже на то, что вы хотите сделать. Возможно, было бы лучше использовать локальную службу.

+0

зеркало кого-нибудь? – Goot

0

Попробуйте Handler.sendEmptyMessageDelayed или Handler.sendEmptyMessageAtTime.

0

Создайте услугу и привяжите ее к вашей деятельности.