Получение контекста в AsyncTask

Я пытаюсь получить контекст в моей AsyncTask класса под названием Opciones (этот класс является единственным, который вызывает эту задачу), но я не знаю, как это сделать, я видел такой код:

protected void onPostExecute(Long result) { Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); } 

Но для меня это не работает, он говорит: "No enclosing instance of the type Opciones in scope"

Solutions Collecting From Web of "Получение контекста в AsyncTask"

Вам нужно делать следующее.

  • Когда вы хотите использовать AsyncTask , расширьте это в другом классе, скажем, MyCustomTask .
  • В конструкторе нового класса, передать контекст

пример

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

И создайте класс следующим образом.

 MyCustomTask task = new MyCustomTask(context); task.execute(..); 

Поскольку только одно действие использует эту задачу, просто сделайте его внутренним классом этой Activity

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

Затем у вас есть доступ к переменным-членам Activity и его Context

Вы можете написать getApplicationContex() . Или Определите глобальную переменную.

 Activity activity; 

И в функции onCreate()

 activity = this; 

тогда,

  protected void onPostExecute(Long result) { Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); } 

Удержание слабой ссылки на хост-активность предотвратит утечку памяти. Для получения дополнительной информации вы можете взглянуть на документацию Stackoverflow

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