J'ai un doute sur la possibilité de répéter un test d'asyncaptage dans une application d'Android. Je voudrais répéter certaines opérations, le téléchargement d'un fichier à partir d'un serveur, par exemple, N fois s'il est impossible pour certaines raisons de télécharger le fichier. Il y a un moyen rapide de faire cela? P>
3 Réponses :
Vous ne pouvez pas répéter un asyncktask mais strong> vous pouvez répéter les opérations qu'il exécute. J'ai fait cette petite classe d'assistance que vous voudrez peut-être étendre à la place de l'asynccct, la seule grande différence est-ce que vous utiliserez la répétitionBackground au lieu de doinbackground et que l'onpostexecute aura un nouveau paramètre, l'exception éventuelle éventuelle éventuelle exception projetée. p> Tout ce qui est à l'intérieur répétitifbackground sera répété automatiquement jusqu'à ce que le résultat soit différent de NULL / EXCEPTION N'EST PAS SHROWNE et là sont moins que les maxtries. P> La dernière exception projetée à l'intérieur de la boucle sera renvoyée dans l'onpostexecute (résultat, exception). p> Vous pouvez définir des essais maximaux à l'aide de la répartition répéterasynccc (int. ) constructeur. p>
Est-ce que cela fonctionne comme une classe statique? J'aime utiliser des masques asynctatiques statiques pour éviter la référence pendante pendant un changement d'orientation. Savez-vous si votre classe fonctionne statiquement?
Je l'utilise toujours statiquement.
Quelque chose comme un retard pourrait-il être ajouté entre les essais? Par exemple pour faire des requêtes chaque seconde.
Vous ne pouvez pas réutiliser le même La tâche ne peut être exécutée qu'une seule fois (une exception sera lancée si une deuxième exécution est tentée.) P>
blockQuote>
Mais vous pouvez créer cependant de nombreux nouveaux objets de cette classe dont vous avez besoin à l'intérieur d'une boucle. Cependant, une meilleure façon de faire le fonctionnement de téléchargement N Nombre de fois à l'intérieur de votre Si cela ne répond pas à votre question, veuillez être plus précis sur votre problème P> asyncktask code> objet comme, Selon les documents d'asynctasque p>
DOINbackground () code>. P>
Je l'ai fait de cette façon. Cela peut essayer d'essayer jusqu'à ce que (essais == max_retry) ou le résultat n'est pas nul. Un code légèrement modifié de la réponse acceptée, mieux pour moi.
private class RssReaderTask extends AsyncTask<String, Void, ArrayList<RssItem>> { // max number of tries when something is wrong private static final int MAX_RETRY = 3; @Override protected ArrayList<RssItem> doInBackground(String... params) { ArrayList<RssItem> result = null; int tries = 0; while(tries++ < MAX_RETRY && result == null) { try { Log.i("RssReaderTask", "********** doInBackground: Processing... Trial: " + tries); URL url = new URL(params[0]); RssFeed feed = RssReader.read(url); result = feed.getRssItems(); } catch (Exception ex) { Log.i("RssReaderTask", "********** doInBackground: Feed error!"); } } return result; } @Override protected void onPostExecute(ArrayList<RssItem> result) { // deal with result } }
Quel est le problème exactement? Vous pouvez simplement démarrer le même système asyncque à nouveau si cela a échoué.
Utilisez la classe Service et Alaram Manager pour répéter la tâche ASYNC