Clase común para AsyncTask en Android?

Tengo una clase común decir por ejemplo la clase A que extiende AsyncTask y tiene todos los métodos aplicados es decir onPreExecute , doinbackground y onPostExecute .

Ahora, hay otras clases que quieren utilizar el objeto de clase A.

Digamos que la clase B usa la clase A de la siguiente manera

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

Entonces busco el resultado en el método get. Pero el método get no es la forma correcta de usar AsyncTask. Me gustaría obtener el resultado en onPostExecute . Para eso onpostexecute intentado usar un parámetro boolean que consiga verdadero solamente en onpostexecute . La clase B comprobará hasta que se haga realidad y cuando se haga realidad, se obtendrá el resultado.

Pero esto es de alguna manera bloquear la aplicación.

He colocado el código para asynctask a continuación.

'

 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; } } 

'

¿Puede alguien decirme cuál puede ser el problema?

Saludos

Sunil

Una manera limpia de utilizar AsyncTask para obtener un resultado sería utilizar una interfaz de devolución de llamada.

He aquí un ejemplo sencillo de este concepto:

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

Entonces en su clase 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); } } 

Ahora debe agregar el siguiente código a su clase 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 esta manera, no es necesario esperar a que la tarea se complete, en su lugar, su código principal (que es probablemente el hilo principal de la interfaz de usuario), está esperando en el bucle de eventos normal de Android y el método onTaskComplete se llamará automáticamente, Permitiendo manejar el resultado de la tarea allí.

 public abstract class BaseTask<T> extends AsyncTask<Object, Void, T> { 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().getString(R.string.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(); } 

Haría de la clase A una clase privada incrustada en la clase padre, y una vez que haya terminado con el trabajo debería actualizar las propiedades de la clase padre, eso es posible onPostExecute.

  • Mostrar una barra de progreso cuando se está cargando una actividad
  • Android AsyncTask
  • AsyncTask: doInBackground no se llama
  • AsyncTask clase externa con ProgressDialog
  • Android llama a AsyncTask justo después de que otro termine
  • ¿Cómo puedo hacer conexiones de URL asíncronas en Android?
  • Getting java.lang.IllegalStateException: El thread actual debe tener un looper
  • ¿Se está destruyendo la actividad porque la orientación ha cambiado o porque la aplicación se está cerrando?
  • Error en la conexión FTP de Android
  • ProgressDialog en AsyncTask lanza una excepción
  • Cómo cambiar el nombre del nombre de Listview Después de enviar una solicitud de servidor dentro de una clase de adaptador personalizado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.