Я пытаюсь получить контекст в своей 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"
AsyncTask
Ответы:
Вам нужно сделать следующее.
пример
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(..);
источник
Слабая ссылка на активность хоста предотвратит утечку памяти.
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 } }
источник
Поскольку только один
Activity
использует эту задачу, просто сделайте ее внутренним классом этого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
источник
AsyncTask
для краткосрочных операций и часто для обновления представлений в файлеActivity
. Часто бывает полезно отменить их,onPause()
если они все еще работают. Может я ошибаюсь, но я всегда так думал об этом. Вот еще кое-что по этому поводу .Вы можете писать
getApplicationContex()
. Или определите глобальную переменную.И на
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(); }
источник