38 votes

android attendre asynctask à la fin

J'ai une fonction, AppHelper.isOnline(Context context), je l'appelle dans les différentes parties de mon application pour vérifier qu'une session n'a pas de délai d'attente avant de faire une requête HTTP.

public void onClick(View v) {
        Intent intent = null;
        switch (v.getId()) {

        case R.id.buttonPagamenti:
            if (AppHelper.isOnline(this))
            {
                //here AppHelper.isOnline should have finished it's async task
                intent = new Intent(this, OrdineCreaActivity.class);
                this.startActivityForResult(intent, R.id.buttonPagamenti);
            }
            break;
...

À l'intérieur d' AppHelper.isOnline(),, je suis de l'exécution d'une tâche asynchrone qui se connecte, rendant ainsi à une demande du réseau, qui ne peuvent pas être exécutées sur l'INTERFACE utilisateur parce que sinon, j'obtiens une exception. J'ai besoin d'attendre qu'il ait fini AVANT de reprendre avec le code à l'intérieur de la si. Comment puis-je faire cela ?

Le problème est le début de l'activité les premières, puis les async exécute, donc lorsque l'activité s'attend à un valide enregistré dans la session, il se casse.

81voto

Boris Strandjev Points 18480

Vous avez deux options:

Soit utiliser l' AsyncTasks'méthode get(long timeout, TimeUnit unit) comme ça:

task.get(1000, TimeUnit.MILLISECONDS);

Cela rendra votre thread principal d'attendre le résultat de l' AsyncTask au plus de 1000 millisecondes (comme par @user1028741 commentaire: en fait, il y a aussi infinetly attente méthode - AsyncTask#get() qui pourrait aussi faire le travail pour vous dans certains cas).

Sinon, vous pouvez afficher une boîte de dialogue de progression dans la tâche asynchrone jusqu'à la fin. Voir ce thread (Pas besoin pour moi de copie d'après le code). Fondamentalement, une boîte de dialogue de progression s'affiche pendant que l'async l'exécution de la tâche et est caché quand il se termine.

Vous avez même une troisième option:" si Thread est suffisant pour vos besoins, vous pouvez utiliser ses join méthode. Toutefois, si la tâche est de prendre un long moment, vous aurez toujours besoin d'afficher une boîte de dialogue de progression, sinon vous obtiendrez une exception en raison de la thread principal d'être inactif depuis trop longtemps.

3voto

Rafiq Points 1060

essayez d'utiliser

 if (AppHelper.isOnline(this))
        {
            while(!task.isCancelled()){
               // waiting until finished protected String[] doInBackground(Void... params)          
              } 
            intent = new Intent(this, OrdineCreaActivity.class);
            this.startActivityForResult(intent, R.id.buttonPagamenti);
        }    
 

Pour plus d'informations, consultez http://developer.android.com/reference/android/os/AsyncTask.html

1voto

Agarwal Shankar Points 14558
 intent = new Intent(this, OrdineCreaActivity.class);
context.startActivityForResult(intent, R.id.buttonPagamenti);
 

Ecrivez les lignes ci-dessus dans onPostExecute () de votre AysncTask. Parce que si nous utilisons AsyncTask, il ne faudra pas attendre la fin de la tâche.

1voto

Mark Cramer Points 108

Rafiq la réponse n'a pas de travail pour moi - l'application accroché. Je pense que la raison a à voir avec la nature de isCancelled(): "Renvoie la valeur true si cette tâche a été annulée avant il terminé normalement." Si la tâche se termine normalement (c'est à dire n'est pas annulé) alors while(!task.isCancelled()) { } boucle pour toujours.

Pour résoudre ce créer un indicateur Booléen qui vous démarrent des instances d' false puis retourner à l' true en task.onPostExecute(). Alors n' while(!flag) { } avant de changer d'Activités. En outre, si vous souhaitez donner le thread principal une "pause" pour laisser le AsyncTask processus un peu plus vite, vous pouvez essayer ceci:

while (!flag) {
    try { Thread.sleep(100); }
    catch (InterruptedException e) { e.printStackTrace(); }
}

Il semble bien fonctionner pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X