2012-01-25 16 views
5

Sto provando a sottoclasse genericamente la classe android.os.AsyncTask. Fondamentalmente voglio solo aggiungere una proprietà ad esso. Il fatto è che voglio ancora poterlo usare come classe anonima.Java: sottoclasse AsyncTask

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

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

    } 

Ho provato la sottoclasse, ma non riesco a avvolgerlo in testa come dovrei fare questo.

saluti, EZFrag

+0

si potrebbe desiderare di dare un'occhiata a questo esempio http://www.etosis.com/posts/asynctask-helpers~~V~~plural~~3rd –

risposta

16

Vuoi dire ancora voglia di essere una classe modello astratto come AsyncTask? La dichiarazione sarebbe:

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

} 
+0

Grazie Ruben, che ha funzionato. Accetterò la tua risposta domani ... Voglio condividere ciò che ho fatto qui sotto. – EZFrag

2

Se ho capito bene la tua domanda, si sono alla ricerca di un modo per istanziare un anonima interna AsyncTask che ha anche una variabile di istanza. Come pensate di passare quel valore aggiuntivo allo AsyncTask?

AFAIK, Java non consente di eseguire l'override del costruttore di una classe interna anonima. Quindi la tua unica speranza è di passare allo come parte del tipo Params (che sembra essere un Vararg). Ciò significa che devi rendere il tipo Params come Context; oppure utilizzare String e serialize/Parcel il Context come String. Sinceramente ritengo che questo non valga la pena e sia troppo di un trucco.

C'è un motivo per cui si desidera utilizzare anonimoAsyncTask? Ti suggerirei di creare un'implementazione denominata di AsyncTask.

+0

+1, questo è il modo corretto di pensare al problema IMO. – Guillaume

6

Grazie a Reuben, funziona al 100% come previsto.

Ecco quello che ho adesso:

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

e questo è come 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(); 

avevo bisogno del contesto per visualizzare i messaggi per l'utente dal compito in sé.

saluti, EZFrag

+1

Potresti aver usato anche YourActivityName.questo AsynkTask anonimo, senza sottoclassi. –