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.
- Ejecutar la tarea asíncrona en orden serial en android4.0
- ¿Qué significa "se ejecuta en el hilo de interfaz de usuario" para onPostExecute () realmente significa?
- AsyncTask - ¿qué parámetros se necesitan para extender y doInBackground?
- OnPostExecute no se llama
- Imageview y PagerAdapter
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
- Problema de corrupción de bases de datos precargado en la aplicación de Android
- ¿Seguro para AsyncTask interno para acceder a los campos de miembros privados de la clase Activity?
- Cómo gestionar varias tareas asíncronas de forma eficiente en Android
- ¿Debo llamar a super.onPostExecute (resultado) en Android AsyncTask?
- Utilizar AsyncTask para cargar imágenes en ListView
- El mismo elemento se elimina dos veces después de ejecutar la llamada de red en un bucle
- AsyncTask's doInBackground (Params ... params)
- Cómo utilizar Runnable.wait () en AsyncTask? ¿Por qué el AsyncTask NO espera ...?
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.