【问题标题】:getting context in AsyncTask在 AsyncTask 中获取上下文
【发布时间】:2013-05-31 00:46:52
【问题描述】:

我正在尝试在名为 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"

【问题讨论】:

标签: android android-asynctask toast android-context


【解决方案1】:

你需要做以下事情。

  • 当你想使用 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(..);

【讨论】:

  • 请注意,最好使用非嵌套或静态类并将 mContext 保存在 WeakReference 中以避免内存泄漏
  • 在嵌套静态类中保持上下文会引发内存泄漏警告
  • 并且还在嵌套类中持有非静态类会导致整个类内存泄漏警告!那么我们应该在没有内存泄漏的情况下使用上下文!?
  • 想办法解决内存泄漏,Context应该是一个WeakReference类。
  • 这不会是嵌套的静态类。它的公共类和需要单独定义然后活动。但是,是的,为了更安全,我们可以使用 Wea​​kReference。
【解决方案2】:

保持对宿主 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
    }
  }

【讨论】:

  • 当我们在activies之间切换(停止和恢复asyntask),然后回来,weakreference是否仍然活跃?
  • 将weakReference传递给类而不是传递myActivity有好处吗?
  • @seekingStillness 弱引用仍然允许 Activity 被垃圾收集,从而防止内存泄漏。
【解决方案3】:

由于只有一个 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 的成员变量

【讨论】:

  • 如果 AsyncTask 类不是静态的,Lint 会显示有关内存泄漏的警告。
  • @SapuSeven 请记住,这只是一个警告。我个人认为如果正确使用这应该不是问题,因为AsyncTask 用于短期操作,并且通常用于更新Activity 中的视图。如果它们仍在运行,通常最好在 onPause() 中取消它们。也许我错了,但这些一直是我的想法。 Here is some more reading on the subject.
【解决方案4】:

你可以写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(); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2010-12-27
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2016-11-22
    相关资源
    最近更新 更多