2012-01-25 11 views
5

Próbuję podklasować klasę android.os.AsyncTask w sposób ogólny. Zasadniczo chcę tylko dodać do niego właściwość. Chodzi o to, że nadal chcę móc używać go jako anonimowej klasy.Java: Subclassing AsyncTask

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

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

    } 

Próbowałem go podklasować, ale po prostu nie mogę owinąć go wokół głowy, jak mam to zrobić.

Pozdrawiam, EZFrag

+0

może chcesz spojrzeć na ten przykład http://www.etosis.com/posts/asynctask-helpers –

Odpowiedz

16

To znaczy, że nadal ma to być klasa abstrakcyjna szablon jak AsyncTask? Deklaracja będzie:

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

} 
+0

Thanks Reuben, który pracował. Przyjmuję twoją odpowiedź jutro ... Chcę podzielić się tym, co zrobiłem poniżej. – EZFrag

2

Jeśli dobrze rozumiem pytanie, szukasz sposobu na instancję anonimowy wewnętrzna AsyncTask który również ma zmienną instancji. W jaki sposób planujesz przekazać tę dodatkową wartość do AsyncTask?

AFAIK, Java nie pozwala na zastąpienie konstruktora anonimowej klasy wewnętrznej. Więc jedyną nadzieją jest przekazanie w Context jako części typu Params (co jest przypadkiem Varargs). Oznacza to, że musisz wprowadzić typ Params jako Context; lub użyj String i serialize, aby uzyskać Context jako jako . Szczerze uważam, że nie jest to warte wysiłku i jest zbyt wielkim hackem.

Czy istnieje powód, dla którego chcesz użyć anonimowegoAsyncTask? Proponuję tylko utworzyć nazwaną implementację AsyncTask.

+0

+1, to właściwy sposób myślenia o problemie IMO. – Guillaume

6

Dzięki Reuben działa w 100% zgodnie z oczekiwaniami.

Oto co mam teraz:

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

I to jak go używać:

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(); 

Potrzebowałem kontekstu do wyświetlania wiadomości do użytkownika z samego zadania.

Pozdrawiam, EZFrag

+1

Mogłeś również użyć YourActivityName.this z anonimowej AsynkTask, bez podklasy. –