Classe commune pour AsyncTask dans Android?

J’ai une classe commune par exemple pour la classe A qui étend AsyncTask et a toutes les méthodes implémentées, à savoir onPreExecute , doinbackground et onPostExecute .

Maintenant, il y a d’autres classes qui veulent utiliser un object de classe A.

Disons que la classe B utilise la classe A de la manière ci-dessous

 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 sera vraie, elle ira chercher le résultat.

Mais cela bloque en quelque sorte l’application.

J’ai mis 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 { private Context context = null; private final HttpClient httpClient = new DefaultHttpClient(); private Ssortingng content = null; //private Ssortingng error = null; private Ssortingng 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 Ssortingng doInBackground(Ssortingng... urls) { try { //urls[0] = URLEncoder.encode(urls[0], "UTF-8"); HttpGet httpget = new HttpGet(urls[0]); ResponseHandler 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(Ssortingng 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 Ssortingng getResult() { return finalResult; } } 

Quelqu’un peut-il me faire savoir quel est le problème?

Cordialement

Sunil

Une manière 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 { public void onTaskComplete(T result); } 

alors dans votre classe B:

 class B implements AsyncTaskCompleteListener { public void onTaskComplete(Ssortingng result) { // do whatever you need } public void launchTask(Ssortingng url) { A a = new A(context, this); a.execute(url); } } 

vous devez maintenant append le code suivant à votre classe A:

 class A extends AsyncTask { private AsyncTaskCompleteListener callback; public A(Context context, AsyncTaskCompleteListener cb) { this.context = context; this.callback = cb; } protected void onPostExecute(Ssortingng 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, à la place, votre code principal (qui est probablement le thread d’interface utilisateur principal) attend dans 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.

 public abstract class BaseTask extends AsyncTask { public Context context; public ProgressDialog dialog; public Exception exception; protected BaseTask() { } public BaseTask(Context context) { this.context = context; this.dialog = new ProgressDialog(context); } @Override protected void onPreExecute() { this.dialog.setMessage(context.getResources().getSsortingng(R.ssortingng.loading)); this.dialog.show(); } @Override protected T doInBackground(Object... objects) { try { return doWork(objects); } catch (Exception e) { exception = e; } return null; } @Override protected void onPostExecute(T result) { if (dialog.isShowing()) dialog.dismiss(); if (exception == null) { onResult(result); } else { onError(); } } public abstract T doWork(Object... objects) throws Exception; public abstract void onResult(T result); public abstract void onError(); } 

Je ferais de la classe A une classe privée incorporée dans la classe parente, et une fois le travail terminé, il devrait mettre à jour les propriétés de la classe parente, ce qui est possible sur ongletPostExecute.