Próbuję uzyskać kontekst w moim AsyncTask klasy o nazwie Opciones (ta klasa jest jedyną, która wywołuje to zadanie), ale nie wiem, jak to zrobić, widziałem taki kod:
protected void onPostExecute(Long result) {
Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show();
}
Ale to nie działa dla mnie, mówi: "No enclosing instance of the type Opciones in scope"
AsyncTask
Odpowiedzi:
Musisz wykonać następujące czynności.
Przykład
public class MyCustomTask extends AsyncTask<Void, Void, Long> { private Context mContext; public MyCustomTask (Context context){ mContext = context; } //other methods like onPreExecute etc. protected void onPostExecute(Long result) { Toast.makeText(mContext,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); } }
I utwórz instancję klasy, wykonując następujące czynności.
MyCustomTask task = new MyCustomTask(context); task.execute(..);
źródło
Utrzymanie słabego odniesienia do działania hosta zapobiegnie wyciekom pamięci.
static class MyTask extends AsyncTask<Void, Void, Void> { // Weak references will still allow the Activity to be garbage-collected private final WeakReference<Activity> weakActivity; MyTask(Activity myActivity) { this.weakActivity = new WeakReference<>(myActivity); } @Override public Void doInBackground(Void... params) { // do async stuff here } @Override public void onPostExecute(Void result) { // Re-acquire a strong reference to the activity, and verify // that it still exists and is active. Activity activity = weakActivity.get(); if (activity == null || activity.isFinishing() || activity.isDestroyed()) { // activity is no longer valid, don't do anything! return; } // The activity is still valid, do main-thread stuff here } }
źródło
Ponieważ tylko jeden
Activity
używa tego zadania, po prostu uczyń go wewnętrzną klasą tegoActivity
public class Opciones extends Activity { public void onCreate() { ... } public class MyTask extends AsyncTask<> { ... protected void onPostExecute(Long result) { Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); } }
Następnie masz dostęp do zmiennych składowych
Activity
i jegoContext
źródło
AsyncTask
przypadku operacji krótkotrwałych i często w przypadku aktualizowania widoków w plikuActivity
. Często dobrym pomysłem jest anulowanie ich,onPause()
jeśli nadal działają. Może się mylę, ale zawsze takie były moje przemyślenia. Tutaj można przeczytać więcej na ten temat .Możesz pisać
getApplicationContex()
. Lub Zdefiniuj zmienną globalną.I w
onCreate()
funkcjiactivity = this;
następnie,
protected void onPostExecute(Long result) { Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); }
źródło