在 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"

75932 次浏览

You need to do following things.

  • when you want to use AsyncTask, extend that in other class say MyCustomTask.
  • in constructor of new class, pass Context

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

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

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

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