6

Ich habe einen separaten Thread durch Erweitern der AsyncTask Klasse definiert. Innerhalb dieser Klasse führe ich einige Toasts und Dialoge innerhalb der Methoden onPostExecute und onCancelled von AsyncTask durch. Die Toasts bedürfen der Kontext der Anwendung, so dass alles, was ich tun müssen, ist:Was ist der beste Weg, Context innerhalb von AsyncTask zu bekommen?

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

Die Dialoge AlertDialog.Builder erstellt verwenden, die auch einen Kontext in seinem Konstruktor erfordert. Habe ich Recht, dass dieser Kontext der Kontext der Aktivität sein sollte? d.h.

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

wo getActivity eine benutzerdefinierte Klasse werden könnte, dass die aktuelle Aktivität zurückkehrt. Wenn ja, wie kann man am besten mit dieser Situation umgehen? Eine Klasse wie getActivity erstellen oder den Kontext der aktuellen Aktivität an den Konstruktor von AsyncTask übergeben?

Ich glaube, ich bin versucht, die Verwendung von Context zu verstehen - ich habe bemerkt, dass Speicherlecks ein Problem sein können (nicht wirklich die noch verstehen) und wie mit getApplicationContext() ist der beste Ansatz, soweit möglich.

Antwort

12

Erstellen Sie einfach die AsyncTask als innere Klasse Ihrer Aktivität oder den Kontext an den Konstruktor des AsyncTask passieren.

Innenklasse: 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(); 
     } 
    } 
} 

Constructor: 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(); 
    } 
} 

Außerdem vergessen Sie bitte nicht zu Anruf .show() auf Ihrem Dialog .

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

Danke Phil. Meine AsyncTask ist derzeit eine innere Klasse meiner Aktivität (wie Sie oben zeigen). Während dies für 'Toast.makeText (getApplicationContext(), ...' in 'MyTask's UI-Methoden funktioniert, funktioniert' AlertDialog.Builder (getApplicationContext()) 'nicht. Ich nehme an, dass dies so ist, weil dies nicht der Fall ist den richtigen Kontext zu erhalten? Ist es daher nicht erforderlich, den Kontext der Aktivität an den Konstruktor "MyTask" zu übergeben? Oder fehlt mir etwas? –

+0

Konnten Sie den vollständigen Code des Ortes eingeben, an dem Sie Ihren Dialog erstellt haben? Rufen Sie .show() im Dialog auf. –

+0

Okay, ja! Sowohl "Toast" als auch "AlertDialog" funktionieren, wenn Sie den Kontext an 'MyTask's Konstruktor übergeben, wie oben gezeigt, dh" MyTask "mit' MyTask (this) 'von einem onClick-Ereignis in der Hauptaktivität. Richtig, also muss ich nur klarstellen:' MyTask (this) 'übergibt den Kontext der Aktivität an' MyTask', der sowohl von 'Toast' als auch' AlertDialog' verwendet werden kann , während 'Toast' den Anwendungskontext mit' getApplicationContext() 'verwenden kann, kann' AlertDialog' das nicht, dh er benötigt s der Kontext der Aktivität - denke, dass ich dort falsch lag. –