在AsyncTask中获取上下文


83

我正在尝试在名为Opciones的类的AsyncTask中获取上下文(该类是调用该任务的唯一类),但是我不知道该怎么做,我看到了一些类似这样的代码:

      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"


4
Opciones是一项活动吗?如果不是,则需要将上下文传递给该类,然后在AsyncTask
Torben Kohlmeier

Answers:


176

您需要执行以下操作。

  • 当您想使用AsyncTask时,请在其他类中扩展MyCustomTask
  • 在新类的构造函数中,传递上下文

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

36
请注意,使用非嵌套或静态类并在WeakReference中保持mContext以避免内存泄漏会
更好

8
将上下文
保留

2
并且还在嵌套类中持有非静态类会导致整个类的内存泄漏警告!所以我们应该在没有内存泄漏的情况下使用上下文!
阿米尔·侯赛因·加塞米

1
找到解决内存泄漏的方法,Context应该是WeakReference类。
阿米尔·侯赛因·加塞米

这不会嵌套静态类。它的公共类别和活动需要分开定义。但是,是的,为了安全起见,我们可以使用WeakReference。
Chintan Rathod

59

保持对主机活动的弱引用将防止内存泄漏。

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

1
当我们在活动之间进行切换(停止和恢复asyntask),然后返回时,弱引用仍然有效吗?
D4rWiNS

1
将weakReference传递给该类而不是传递myActivity是否有好处?
寻求静养期

1
@seekingStillness弱引用仍将允许对Activity进行垃圾回收,从而防止内存泄漏。
西

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

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


2
如果AsyncTask类不是静态的,则Lint将显示有关内存泄漏的警告。
SapuS7

@SapuSeven请记住,这只是警告。我个人认为,如果将其正确使用(如AsyncTask用于短期操作并经常用于更新)中的视图,应该不成问题ActivityonPause()如果它们仍在运行,则最好取消它们。也许我错了,但是这些一直是我的想法。 这是有关该主题的更多阅读材料
codeMagic

-6

你可以写getApplicationContex()。或定义全局变量。

Activity activity;

而在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(); 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.