在AsyncTask中获取上下文

D4r*_*iNS 78 android toast android-context android-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(); 
}
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用它说: "No enclosing instance of the type Opciones in scope"

Chi*_*hod 170

你需要做以下事情.

  • 当你想使用AsyncTask时,在其他类中扩展它说MyCustomTask.
  • 在新类的构造函数中,传递Context

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(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

并通过以下实例化类.

MyCustomTask task = new MyCustomTask(context);
task.execute(..);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用非嵌套或静态类并在WeakReference中保存mContext以避免内存泄漏会更好 (34认同)
  • 在嵌套静态类中保存上下文会引发内存泄漏警告 (7认同)
  • 并且在嵌套类中持有非静态类会导致整个类内存泄漏警告!那么我们应该使用没有内存泄漏的上下文!? (2认同)

Sai*_*Sai 49

保持对主机Activity的弱引用将防止内存泄漏.

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
    }
  }
Run Code Online (Sandbox Code Playgroud)


cod*_*gic 13

由于只有一个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(); 
     }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问的成员变量Activity及其Context

  • 如果AsyncTask类不是静态的,Lint会显示有关内存泄漏的警告. (2认同)