J'ai une AsyncTask
classe que j'exécute qui télécharge une grande liste de données à partir d'un site Web.
Dans le cas où l'utilisateur final a une connexion de données très lente ou irrégulière au moment de l'utilisation, j'aimerais que le AsyncTask
délai d'attente soit écoulé après un certain temps. Ma première approche est la suivante:
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
downloader.cancel(true);
}
}, 30000 );
Après avoir démarré le AsyncTask
, un nouveau gestionnaire est démarré qui annulera les AsyncTask
30 secondes après s'il est toujours en cours d'exécution.
Est-ce une bonne approche? Ou y a-t-il quelque chose de AsyncTask
mieux adapté à cette fin?
java
android
android-asynctask
Jake Wilson
la source
la source
Réponses:
Oui, il existe AsyncTask.get ()
Notez qu'en appelant ceci dans le thread principal (AKA. UI thread) bloquera l'exécution, vous devrez probablement l'appeler dans un thread séparé.
la source
handler
approche que je décris dans ma question? Cela semble beaucoup plus simple car le thread de l'interface utilisateur ne se fige pas en attendant d'exécuter le gestionnaire d'exécution ...Dans le cas où votre téléchargeur est basé sur une connexion URL, vous disposez d'un certain nombre de paramètres qui pourraient vous aider à définir un délai d'expiration sans code complexe:
Si vous apportez simplement ce code dans votre tâche asynchrone, c'est ok.
«Read Timeout» consiste à tester un mauvais réseau tout au long du transfert.
'Connection Timeout' n'est appelé qu'au début pour tester si le serveur est opérationnel ou non.
la source
Utilisez la classe CountDownTimer à côté de la classe étendue pour AsyncTask dans la méthode onPreExecute ():
Principal avantage, la surveillance Async effectuée en interne dans la classe.
changez CountDownTimer (7000, 7000) -> CountDownTimer (7000, 1000) par exemple et il appellera onTick () 6 fois avant d'appeler onFinish (). C'est bien si vous souhaitez ajouter une surveillance.
Merci pour tous les bons conseils que j'ai reçus sur cette page :-)
la source
Je ne pense pas qu'il y ait quelque chose comme ça intégré à AsyncTask. Votre approche semble être la bonne. Assurez-vous simplement de vérifier périodiquement la valeur de isCancelled () dans la méthode doInBackground de votre AsyncTask pour mettre fin à cette méthode une fois que le thread d'interface utilisateur l'a annulée.
Si vous souhaitez éviter d'utiliser le gestionnaire pour une raison quelconque, vous pouvez vérifier périodiquement System.currentTimeMillis dans votre AsyncTask et quitter à l'expiration du délai, bien que j'aime mieux votre solution car elle peut en fait interrompre le thread.
la source
la source
Vous pouvez mettre une condition supplémentaire pour rendre l'annulation plus robuste. par exemple,
la source
Inspiré de la question, j'ai écrit une méthode qui effectue une tâche d'arrière-plan via AsyncTask et si le traitement prend plus de LOADING_TIMEOUT, un dialogue d'alerte pour réessayer apparaîtra.
la source