28 votes

Valeur de retour AsyncTask

Mon application android se connecte à mon site web pour extraire et de télécharger des informations donc j'utilise un AsyncTask fil.

Dans un exemple, j'ai besoin de mon thread de retour d'un vrai ou d'un faux de la valeur de mon thread principal.

Est-il un moyen d'obtenir cette valeur de retour à partir d'une AsyncTask fonction execute?

Quand je fais le suivant:

Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show();

Je viens d'obtenir beaucoup de charabia.

Je pense que ce dont j'ai besoin est un moyen pour mettre en pause le thread principal jusqu'à ce que le deuxième thread se termine. Le deuxième thread appelle une fonction dans le thread principal pour configurer ma valeur de retour. Ainsi, lorsque le deuxième thread se termine, le thread principal peut reprendre et d'accéder à la valeur de retour comme indiqué par le deuxième thread Si cette logique est de son, merci de vous offrir des suggestions ... merci!

40voto

Idolon Points 11503

Vous pouvez utiliser AsyncTask get() méthode pour cela. Il attend, si nécessaire, pour le calcul à effectuer, puis récupère son résultat:

Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show();

Mais veillez à ne pas bloquer le thread principal pour une longue période de temps, comme cela conduira à l'absence de réponse de l'INTERFACE utilisateur et de l'ANR.

Mise à JOUR
J'ai raté le point de cette question a été sur async web de téléchargement/chargement. Web/le fonctionnement du réseau devraient considéré comme un long et donc l'approche "pause thread d'INTERFACE utilisateur et d'attendre que le téléchargement finit" est toujours un mal un. L'utilisation d'habitude suite de la publication de l'approche intstead (par exemple: AsyncTask.onPostExecute, le Service + sendBroadcast, bibliothèques, comme le Volley, la RoboSpice, DataDroid etc).

4voto

Sunil Pandey Points 3605

gestionnaire est le meilleur moyen de le faire dans la méthode onPostExcecute simplement

 @Override
    protected void onPostExecute(Boolean bool) {
        super.onPostExecute(bool);
           Message msg=new Message();
            msg.obj=bool;
            mHandler.sendMessage(msg);
        }
    }
 

et votre gestionnaire de messages sera

 mHandler = new Handler() { 
              @Override public void handleMessage(Message msg) { 
                 bool i=(String)msg.obj;

              }
          };
 

1voto

user462990 Points 851
public class RunWebScript {
String mString;
public RunWebScript(String url){
    try {   
        URL updateURL = new URL(url);  
        URLConnection conn = updateURL.openConnection(); 
        // now read the items returned...
        InputStream is = conn.getInputStream();  
        BufferedInputStream bis = new BufferedInputStream(is);  
        ByteArrayBuffer baf = new ByteArrayBuffer(50);  
        int current = 0;  
        while((current = bis.read()) != -1){  
            baf.append((byte)current);  
        }   
        String s = new String(baf.toByteArray());
         mString = s;
    } catch (Exception e) {  
        Log.e("ANDRO_ASYNC", "exception in callWebPage",e); 
        mString = "error";
    }
}
public String getVal(){
    return mString;
}   

}

c'est exécutée en tant que... (montrant la teh à la fin d'une méthode de la classe appelante

        asyncWebCall (url1,CONSTANT);
}
private void asyncWebCall(String url,int actionPostExecute){
    new WebCall().execute(url,String.format("%d",actionPostExecute));
}   

L'Async partie de l'entreprise est ... à Noter le cas énoncé dans onPostExecute c'est la clé pour obtenir la valeur retournée ito votre programme à nouveau. Notez que l'appel de nouveaux WebCall().execute(url,String.format("%d",actionPostExecute)); est la dernière chose à faire dans un thread, aucun extrait ne peut être exécuté, le contrôle retourne à travers le onPostExecute.

class WebCall extends AsyncTask<String, String, String>{
    int chooser = -1;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override   
    protected String doInBackground(String... params) {
        try {
            chooser = Integer.parseInt(params[1]);
        } catch(NumberFormatException nfe) {
            Log.d("ANDRO_ASYNC",String.format("asyncReturn() mString numberformatexception = %s",params[1]));
            chooser = 0;
        }
        return(new RunWebScript(params[0])).getVal();           
    }
    protected void onProgressUpdate(String... progress) {       
    }
    @Override
    protected void onPostExecute(String gotFromDoInBkgnd) {
        Log.d("ANDRO_ASYNC",String.format("chooser = %s",chooser));
        switch (chooser){
        case CONSTANT:
            printStringx(gotFromDoInBkgnd);
            asyncWebCall(url2,5); 
            break;
        case 0:
            Log.d("ANDRO_ASYNC",String.format("case 0 = %s",gotFromDoInBkgnd));
            break;
        case 5:
            Log.d("ANDRO_ASYNC",String.format("case 5 = %s",gotFromDoInBkgnd));
            asyncWebCall(url3,7);

            break;

        default:
            Log.d("ANDRO_ASYNC",String.format("man we got problems = %s",gotFromDoInBkgnd));
            break;
        }
    }

} // fin de la classe

0voto

user462990 Points 851

Voici un exemple complet du problème de renvoi de valeurs à partir d'une tâche asynchrone. Il peut arriver que de nombreuses tâches soient effectuées l'une après l'autre de manière asynchrone.

Les bases. 1. obtenez une valeur de retour d'une classe.

 public class Snippet {
int computVal;
public Snippet(){
    computVal = 17*32; 
}
public int getVal(){
    return computVal;
}   
 

}

cela s'appelle comme ...

 int hooray = (new Snippet()).getVal();
 

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