2012-01-25 18 views
5

Estoy intentando subclasificar la clase android.os.AsyncTask genéricamente. Básicamente solo quiero agregarle una propiedad. La cuestión es que todavía quiero poder utilizarlo como una clase anónima.Java: Subclase AsyncTask

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

    public class KAsyncTask extends AsyncTask<Params, Progress, Result> { 
     public Context c; 

    } 

He intentado subclasificarlo, pero no puedo envolverlo en mi cabeza cómo se supone que debo hacer esto.

Saludos, EZFrag

+0

Es posible que desee ver en este ejemplo http://www.etosis.com/posts/asynctask-helpers~~V~~plural~~3rd –

Respuesta

16

Usted quiere decir todavía quieren que sea una clase de plantilla abstracta como AsyncTask? La declaración sería:

public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
    public Context c; 

} 
+0

Gracias Rubén, que funcionó. Aceptaré tu respuesta mañana ... Quiero compartir lo que hice a continuación. – EZFrag

2

Si entiendo bien su pregunta, que están buscando una manera de crear una instancia de un anónima interior AsyncTask que también tiene una variable de instancia. ¿Cómo planea pasar ese valor adicional al AsyncTask?

AFAIK, Java no le permite anular el constructor de una clase interna anónima. Entonces, su única esperanza es pasar el Context como parte del tipo Params (que resulta ser un Varargs). Esto significa que debe hacer que el tipo Params sea Context; o utilice un String y serialize/Parcel su Context como String. Sinceramente, creo que esto no vale la pena el esfuerzo y es demasiado pirateo.

¿Hay alguna razón por la que desee utilizar anónimoAsyncTask? Solo le sugiero que cree una implementación con nombre de AsyncTask.

+0

+1, esa es la manera correcta de pensar sobre el problema de la OMI. – Guillaume

6

Gracias Reuben, funciona al 100% como se esperaba.

Esto es lo que tengo ahora:

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

    public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
     public Context context; 

     public KAsyncTask<Params, Progress, Result> setContext(Context c){ 
      this.context = c; 
      return this; 
     } 
    } 

y así es como lo uso:

new KAsyncTask<Void, Void, Void>() { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "Connecting to Server...", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      //super.onPostExecute(result); 
      Toast.makeText(context, "Responce Recieved.", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

      //Do webservice calls in here 

      return null; 
     } 

    }.setContext(this).execute(); 

que necesita el contexto para mostrar mensajes al usuario de la tarea en sí.

Saludos, EZFrag

+1

También podría haber usado YourActivityName.this desde su AsynkTask anónimo, sin crear subclases. –