android return - Classe courante pour AsyncTask dans Android?




2 Answers

Un moyen propre d'utiliser AsyncTask pour obtenir un résultat serait d'utiliser une interface de rappel.

Voici un exemple simple de ce concept:

interface AsyncTaskCompleteListener<T> {
   public void onTaskComplete(T result);
}

puis dans votre classe B:

class B implements AsyncTaskCompleteListener<String> {

    public void onTaskComplete(String result) {
        // do whatever you need
    }

    public void launchTask(String url) {
        A a = new A(context, this);
        a.execute(url);
    }
}

vous devriez maintenant ajouter le code suivant à votre classe A:

class A extends AsyncTask<String, Void, String> {
    private AsyncTaskCompleteListener<String> callback;

    public A(Context context, AsyncTaskCompleteListener<String> cb) {
        this.context = context;
        this.callback = cb;
    }

    protected void onPostExecute(String result) {
       finalResult = result;
       progressDialog.dismiss();
       System.out.println("on Post execute called");
       callback.onTaskComplete(result);
   }  
}

De cette façon, vous n'avez pas besoin d'attendre explicitement que votre tâche se termine, votre code principal (qui est probablement le thread principal de l'interface utilisateur) attend la boucle d'événement android normale, et la méthode onTaskComplete sera automatiquement appelée, permettant de gérer le résultat de la tâche là-bas.

value params

J'ai une classe commune dire par exemple pour la classe A qui étend AsyncTask et a toutes les méthodes mises en œuvre à savoir onPreExecute , doinbackground et onPostExecute .

Maintenant, il existe d'autres classes qui veulent utiliser un objet de classe A.

Dites que la classe B utilise la classe A de la manière suivante

A a = new A(context)
a.execute(url)

Ensuite, je récupère le résultat dans la méthode get. Mais la méthode get n'est pas la bonne façon d'utiliser AsyncTask. J'aimerai obtenir le résultat dans onPostExecute . Pour cela, j'ai essayé d'utiliser un paramètre booléen qui ne deviendra vrai que dans onpostexecute . La classe B vérifiera jusqu'à ce qu'elle devienne vraie et quand elle deviendra vraie, elle ira chercher le résultat.

Mais cela bloque en quelque sorte l'application.

J'ai placé le code pour asynctask ci-dessous.

'

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.ResponseHandler;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.BasicResponseHandler;

import org.apache.http.impl.client.DefaultHttpClient;


import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class A extends AsyncTask<String, Void, String> 
{
private Context context = null;

private final HttpClient httpClient = new DefaultHttpClient();

private String content = null;
//private String error = null;
private String finalResult = null;
private static boolean isResult = false;

private ProgressDialog progressDialog = null; 

public BabbleVilleSyncTask(Context context)
{
    this.context = context; 
    progressDialog = new ProgressDialog(this.context);
}

protected void onPreExecute() 
{
    progressDialog.setMessage("Please Wait....");
    progressDialog.show();
}

protected String doInBackground(String... urls) 
{
    try 
    {
        //urls[0] = URLEncoder.encode(urls[0], "UTF-8");

        HttpGet httpget = new HttpGet(urls[0]);
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        content = httpClient.execute(httpget, responseHandler);
    }
    /*catch(UnsupportedEncodingException ue)
    {
        error = ue.getMessage();
    }*/
    catch (ClientProtocolException e) 
    {
        //error = e.getMessage();
        cancel(true);
    }
    catch (IOException e) 
    {
        //error = e.getMessage();
        cancel(true);
    }

    httpClient.getConnectionManager().shutdown();

    return content;
}

protected void onPostExecute(String result) 
{
    finalResult = result;
    progressDialog.dismiss();
    System.out.println("on Post execute called");
    isResult = true;
}  

public boolean getIsResult()
{
    return isResult;
}

public void setIsResult(boolean flag)
{
    isResult = flag;
}

public String getResult()
{
    return finalResult;
}
}

'

Quelqu'un peut-il me dire quel est le problème?

Cordialement

Sunil




Je ferais de classe A une classe privée incorporée dans la classe parent, et une fois que cela est fait avec le travail, il devrait mettre à jour les propriétés de la classe parent, c'est possible onPostExecute.




Related

android android-asynctask