Reputation: 2615
I am trying to get the context in my AsyncTask of the class called Opciones(this class is the only one that call that task) but I don't know how to do it, I saw some code like this:
protected void onPostExecute(Long result) {
Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show();
}
But it doesn't work for me it says: "No enclosing instance of the type Opciones in scope"
Upvotes: 86
Views: 77118
Reputation: 15738
Holding a weak reference to the host Activity will prevent memory leaks.
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
}
}
Upvotes: 62
Reputation: 26034
You need to do following things.
Example
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();
}
}
And instantiate class by following.
MyCustomTask task = new MyCustomTask(context);
task.execute(..);
Upvotes: 182
Reputation: 1810
You can write getApplicationContex()
. Or
Define global variable.
Activity activity;
And at the onCreate()
function
activity = this;
then,
protected void onPostExecute(Long result) {
Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show();
}
Upvotes: -7
Reputation: 44571
Since only one Activity
uses this task then just make it an inner class of that 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();
}
}
Then you have access to member variables of the Activity
and its Context
Upvotes: 13