2011-08-15 10 views
23

Chcę wykonać preformę Toast po zakończeniu zadania w tle, aby poinformować użytkownika, że ​​jest on ukończony.Jak przekazać kontekst do AsyncTask?

Zrobiłem nową klasę dla mojego asyncTask, ale nie mogę używać getApplicationContext() w obrębie tej klasy.

Używam task.execute(getTempFile(this), getApplicationContext()); do uruchamiania zadań. getTempFile zwraca obiekt File i próbowałem przekazać kontekst jako obiekt Context.

Moja klasa zadań ma 3 zmienne AsyncTask<Object, Integer, Integer>, więc kontekst znajduje się w drugim obiekcie. To jednak powoduje awarię aplikacji.

Edit

public class LocationActivity extends Activity implements LocationListener { 
    protected void handleImage(Bitmap thumbnail){ 
     PushDataToServer task = new PushDataToServer(); 
     task.execute(getTempFile(this), getApplicationContext()); 
    } 
} 




public class PushDataToServer extends AsyncTask<Object, Integer, Integer> { 

    Context context; 

    @Override 
    protected Integer doInBackground(Object... params) { 
     // TODO Auto-generated method stub 
     this.context = (Context) params[1]; 
     File file = (File) params[0]; 
     return null; 
    } 

    protected void onPostExecute(String result) { 
     Toast toast = Toast.makeText(this.context, "All done!", Toast.LENGTH_SHORT); 
     toast.show(); 
    } 

} 
+0

zgłoś swoją klasę AsyncTask i szkielet głównej klasie :) – Codeman

+0

Zaktualizowałem moje pytanie za pomocą przykładowego kodu. – dotty

Odpowiedz

75

Przekaż obiekt Context do konstruktora AsyncTask.

Przykładowy kod:

public class MyTask extends AsyncTask<?, ? ,?> { 
    private Context mContext; 

    public MyTask(Context context) { 
     mContext = context; 
    } 
} 

a następnie, gdy budują swoje AsyncTask:

MyTask task = new MyTask(this); 
task.execute(...); 
+0

Toast nigdy nie jest wyświetlany. Jakieś inne pomysły? – dotty

+0

"Toast" powinien być wyświetlany, gdy wywołujesz 'show()' w funkcjach działających na wątku UI. Czy na pewno tak jest? – Wroclai

+0

Toast jest w mojej metody onPostExecute(). Przykład kodu znajduje się powyżej. – dotty

0

Mówisz context jest w drugim obiekcie, ale twój drugi obiekt jest Integer. Czy to może być twój problem? Ponadto - inną propozycją jest umieszczenie twojej klasy AsyncTask jako prywatnej klasy wewnętrznej w twojej aktywności - w ten sposób jestem pewien, że będziesz miał dostęp do getApplicationContext().

2

Przekaż go do konstruktora, a nie jako parametr metody. Wtedy nie musisz polegać na ogólnych parametrach.

Powiązane problemy