6

Ho definito un thread separato estendendo la classe AsyncTask. All'interno di questa classe eseguo alcuni toast e finestre di dialogo all'interno dei metodi onPostExecute e onCancelled di AsyncTask. I brindisi richiedono contesto dell'applicazione in modo che tutto quello che ho bisogno di fare è:Qual è il modo migliore per ottenere/utilizzare Context all'interno di AsyncTask?

Toast.makeText(getApplicationContext(),"Some String",1); 

Le finestre di dialogo sono creati utilizzando AlertDialog.Builder che richiede anche un contesto nel suo costruttore. Ho ragione nel ritenere che questo contesto debba essere il contesto dell'attività? cioè

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

dove getActivity potrebbe essere una classe definita dall'utente che restituisce l'attività corrente. Se sì, qual è il modo migliore per gestire questa situazione? Creare una classe come getActivity o passare il contesto dell'attività corrente al costruttore di AsyncTask?

Credo che sto cercando di capire l'uso di Context - Ho notato che le perdite di memoria possono essere un problema (non in realtà non capire questo ancora) e come utilizzare getApplicationContext() è l'approccio migliore, se possibile.

risposta

12

sufficiente creare l'AsyncTask come una classe interna della vostra attività, o passare il contesto al costruttore della AsyncTask.

classe interna: MyActivity.java

public class MyActivity extends Activity { 

    // your other methods of the activity here... 


    private class MyTask extends AsyncTask<Void, Void, Void> { 

     protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
     } 

     protected Void onProgressUpdate(Void... prog) { 

      Toast.makeText(getActivity(), "text", 1000).show(); 
     } 
    } 
} 

Costruttore: MyTask.java

public class MyTask extends AsyncTask<Void, Void, Void> { 

    Context c; 

    public MyTask(Context c) { 
      this.c = c; 
    } 

    protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
    } 

    protected Void onProgressUpdate(Void... prog) { 
      Toast.makeText(c, "text", 1000).show(); 
    } 
} 

Inoltre, si prega di non dimenticare di chiamata .Show() sul dialogo .

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
builder.show(); 
+0

Grazie Phil. Il mio AsyncTask è attualmente una classe interiore della mia attività (come mostrato sopra). Tuttavia, mentre questo funziona per 'Toast.makeText (getApplicationContext(), ...' nei metodi di interfaccia utente di 'MyTask',' AlertDialog.Builder (getApplicationContext()) 'non funziona. Presumo che ciò sia dovuto al fatto che non è ottenere il contesto giusto? Quindi, non è necessario passare il contesto dell'attività al costruttore di 'MyTask'? O mi sto sfuggendo qualcosa? –

+0

Potresti pubblicare il codice completo di dove stai creando la tua finestra di dialogo? chiama .show() sulla finestra di dialogo –

+0

Ok, sì! Sia 'Toast' che' AlertDialog' funzionano quando si passa il contesto al costruttore 'MyTask' come si è mostrato sopra, cioè, istanziando' MyTask' usando 'MyTask (questo 'da un evento onClick nell'attività principale. Giusto, quindi ho solo bisogno di chiarire:' MyTask (this) 'passa il contesto dell'attività a' MyTask' che può essere usato sia da 'Toast' che da' AlertDialog'. , mentre 'Toast' può usare il contesto delle applicazioni usando' getApplicationContext() ',' AlertDialog' non può, cioè, necessita s il contesto dell'attività - pensa che è dove stavo sbagliando. –

Problemi correlati