6
votes

Répéter AsynccTask

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?


2 commentaires

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


3 Réponses :


11
votes

Vous ne pouvez pas répéter un asyncktask mais 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.

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.

La dernière exception projetée à l'intérieur de la boucle sera renvoyée dans l'onpostexecute (résultat, exception).

Vous pouvez définir des essais maximaux à l'aide de la répartition répéterasynccc (int. ) constructeur. xxx


3 commentaires

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.



1
votes

Vous ne pouvez pas réutiliser le même asyncktask objet comme, Selon les documents d'asynctasque

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.)

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 DOINbackground () .

Si cela ne répond pas à votre question, veuillez être plus précis sur votre problème


0 commentaires

0
votes

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
    }

}


0 commentaires