2011-11-01 4 views
-1

J'ai créé une tâche asynchrone comme ceci:Asynchronous tâche

private class LongOperationcheckall extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String result="Start"; 
     try 
     { 
      Looper.myLooper().prepare(); 
      // Looper.loop(); 

      // TODO Auto-generated method stub 
      for(int k=0;k<13;k++) 
      { 
       checkall(); 
       this.publishProgress("Show the dialog"); 

       //count++; 
      } 

      result="Success"; 
      checkallcomp++; 

      OnscanComplete(); 
     } 
     catch(Exception ex) 
     { 
      checkallcomp++; 
      OnscanComplete(); 
     } 
     return result; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     Log.i("Progress", "Progressincheck"); 
    } 

    protected void onPostExecute(String params) { 
     Log.w("all Check",params); 

     // Execution of result of Long time consuming operation 
    } 
} 

Je code ajouté,

Looper.myLooper().prepare(); 

appeler à cette tâche comme

taskAllcheck = new LongOperationcheckall(); 
taskAllcheck.execute(); 

La quatrième fois où Je clique sur le bouton de démarrage la quatrième fois, il donne l'exception

Impossible de créer un gestionnaire à l'intérieur du fil à l'intérieur fil pas appelé looper.prepare

Seulement, quand je lance dans l'appareil, il exécute OK dans l'émulateur, mais après ajouter cette ligne, l'erreur vient comme un seul looper peut être créé par thread lorsque je clique sur le bouton de démarrage pour la quatrième fois et appelez taskAllcheck.execute();.

+0

Que fait la méthode checkall()? L'exception "Impossible de créer un gestionnaire ..." se produit généralement lorsque vous essayez de faire quelque chose qui n'est autorisé que dans le thread d'interface utilisateur, dans un thread d'arrière-plan. Check12 ( – Egor

+0

checkall() seulement vérifier le paramètre comme bluetooth activé ou désactivé, GPS activé ou désactivé dans l'appareil et mettre à jour l'état en fonction dans la base de données –

+0

Voilà de quoi je parle. Peut-être, ce sont des opérations qui doivent être exécutées sur le thread de l'interface utilisateur. Vous pouvez les placer dans Runnable dans la méthode activity.runOnUIThread(), de cette façon vous surmonterez l'exception Looper. – Egor

Répondre

-1

Veuillez considérer le thread asynchrone comme un thread d'interface utilisateur disposant d'un gestionnaire intégré pour mettre à jour votre interface utilisateur. Peu importe quoi, c'est un fil. Donc, maintenant que cela est effacé, je ne vois pas où vous avez réellement écrit la fonction checkall(). La vérification de toutes les fonctions doit être une méthodologie locale pour la tâche asynchrone à appeler en arrière-plan. Cela ne peut pas être une méthode dans votre classe principale. Si tel est le cas, il ne sert à rien d'avoir une tâche asynchrone. Alors s'il vous plaît ajouter la fonction checkall() à votre tâche asynchrone.

Ensuite, le boucleur n'est pas nécessaire dans la tâche asynchrone. Le traitement des données est pris en charge par:

this.publishProgress ("Afficher le dialogue");

Veuillez vous assurer que vous transmettez tout ce que vous voulez. Soit un int, string, boolean, array ou tout et n'importe quoi peut être manipulé dans ceci. Donc, faites un usage judicieux de la mise en œuvre.

Maintenant, faites l'intérieur le onProgressUpdate() en conséquence et par conséquent également s'il vous plaît vérifiez que si vous voulez quelque chose du thread de l'interface utilisateur à exécuter, comme une méthode ou quelque chose. Cela peut être fait dans cette méthode.

Maintenant, faites les changements que je vous ai déjà dit. Veuillez me revenir et je serai dans une meilleure position pour travailler avec vous. Si nous pouvons identifier le problème. Prends soin.

+0

Merci Peter pour le montage. Je le garderai à l'esprit. – medampudi