【问题标题】:How do i pass a context to an AsyncTask?如何将上下文传递给 AsyncTask?
【发布时间】:2011-10-27 07:59:14
【问题描述】:

我想在后台任务完成时执行Toast,只是为了让用户知道它已经完成。

我为我的 asyncTask 创建了一个新类,但我不能在这个类中使用getApplicationContext()

我正在使用task.execute(getTempFile(this), getApplicationContext()); 来运行任务。 getTempFile 返回一个 File 对象,我试图将上下文作为 Context 对象传递。

我的 Task 类有 3 个变量 AsyncTask<Object, Integer, Integer> 所以上下文在第二个对象中。但是,这会使应用程序崩溃。

编辑

public class LocationActivity extends Activity implements LocationListener {
    protected void handleImage(Bitmap thumbnail){
        PushDataToServer task = new PushDataToServer();
        task.execute(getTempFile(this), getApplicationContext());
    }
}




public class PushDataToServer extends AsyncTask<Object, Integer, Integer> {

    Context context;

    @Override
    protected Integer doInBackground(Object... params) {
        // TODO Auto-generated method stub
        this.context = (Context) params[1];
        File file = (File) params[0];
        return null;
    }

    protected void onPostExecute(String result) {   
         Toast toast = Toast.makeText(this.context, "All done!", Toast.LENGTH_SHORT);
         toast.show();
    }

}

【问题讨论】:

  • 请发布您的 AsyncTask 类和主类的骨架 :)
  • 用代码示例更新了我的问题。

标签: java android android-asynctask


【解决方案1】:

您说您的上下文在第二个对象中,但您的第二个对象是整数。这可能是你的问题吗?另外 - 另一个建议是将你的 AsyncTask 类作为你的活动的私有内部类 - 这样我很确定你将可以访问 getApplicationContext()。

【讨论】:

    【解决方案2】:

    在构造函数中传递它,而不是作为方法参数。那么你就不需要依赖泛型参数了。

    【讨论】:

      【解决方案3】:

      Context 对象传递给AsyncTask 的构造函数。

      示例代码:

      public class MyTask extends AsyncTask<?, ? ,?> {
          private Context mContext;
      
          public MyTask(Context context) {
              mContext = context;
          } 
      }
      

      然后,当您构建 AsyncTask:

      MyTask task = new MyTask(this);
      task.execute(...);
      

      【讨论】:

      • 当您在 UI 线程上运行的函数中调用 show() 时,应显示 Toast。你确定是这样吗?
      • toast 在我的 onPostExecute() 方法中。代码示例如上。
      • 我可以在我的onPostExecute() 方法中完美地展示Toasts。我怀疑你做错了什么。
      • 如果在异步任务完成之前销毁活动,这不会导致泄漏吗?
      • IDE 显示“问题 id:StaticFieldLeak”
      【解决方案4】:

      完整示例:Reusable AsyncTask

      【讨论】:

      • 这应该是一条评论。
      • 不解决将上下文传递到后台任务的问题。
      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2013-07-13
      • 2015-06-29
      • 2015-06-17
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多