maketext - toast properties android
Obtención de contexto en AsyncTask (4)
Estoy intentando obtener el contexto en mi AsyncTask de la clase llamada Opciones (esta clase es la única que llama esa tarea) pero no sé cómo hacerlo, vi un código como este
protected void onPostExecute(Long result) {
Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show();
}
Pero no funciona para mí, dice: "No enclosing instance of the type Opciones in scope"
Mantener una referencia débil a la actividad del host evitará las fugas de memoria.
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
}
}
Puedes escribir getApplicationContex()
. O definir variable global.
Activity activity;
Y en la función onCreate()
activity = this;
entonces,
protected void onPostExecute(Long result) {
Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show();
}
Tienes que hacer lo siguiente.
- cuando quiera usar AsyncTask , extiéndalo en otra clase, por ejemplo MyCustomTask .
- En constructor de nueva clase, pase contexto.
Ejemplo
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();
}
}
Y ejemplifica la clase siguiendo.
MyCustomTask task = new MyCustomTask(context);
task.execute(..);
Ya que solo una Activity
usa esta tarea, entonces hágala una clase interna de esa 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();
}
}
Luego tienes acceso a las variables miembro de la Activity
y su Context