【问题标题】:Where to get context for a new Intent when calling out of an AsyncTask?调用 AsyncTask 时在哪里获取新 Intent 的上下文?
【发布时间】:2013-08-29 16:25:19
【问题描述】:

我想我没有得到关于 android 活动生命周期的任何信息。

这就是我的情况 - 我有一个 AsyncTask,它负责将 XML 文件上传到服务器。当用户在活动中填写所需数据后按下按钮时调用它。在它被调用之后,我真的不再需要这个活动了,所以我调用了 finish();马上。

task = new ASSend(data);
task.execute();
finish();

但是,如果在执行 AsyncTask 期间出现问题,我需要显示错误消息(因此我需要使用 AlertDialog 或以对话框为主题的意图),并且我还需要在 doInBackground 中打开文件

FileInputStream fis;    
fis = context.openFileInput(filePath);

需要上下文。是否可以传递启动 AsyncTask 的 Activity 的上下文来执行所有这些操作,即使启动 AsyncTask 的 Activity 不再存在?

【问题讨论】:

  • 您可以保留对它的引用,但这将是令人担忧的上下文泄漏:android-developers.blogspot.de/2009/01/…
  • 为什么不创建一个新的对话活动,如果上传失败,异步任务将启动。它也可以要求用户再试一次...
  • 启动执行 ASyncTask 的服务(而不是在您的 Activity 中强制启动 AsyncTask)。你可以在后台服务中做任何你想做的事情。

标签: android android-intent android-asynctask


【解决方案1】:

也许您不应该立即就该活动致电finish()。尝试在异步任务中添加一个进度对话框来显示各种加载屏幕。

public class task extends AsyncTask<Object, Object, Object>  {
ProgressDialog mDialog;
Context mContext;

    public task (Context context) {
         this.mContext = context;
    }
    @Override
protected void onPreExecute() {
    super.onPreExecute();

    mDialog = new ProgressDialog(mContext);
    mDialog.setMessage("Preparing Route...");
    mDialog.show();
}

    @Override
protected void onPostExecute(Object obj) {
    mDialog.dismiss();
            // then call finish?
}

【讨论】:

  • 不过这会很麻烦。您需要弹出一个对话框并等待不确定的时间才能退出活动,而不是根据需要立即退出活动。
  • 我实际上需要允许用户在上传 xml 时在另一个活动中工作 - 它可能会变得非常大。
  • @AlcherBlack,如果是这样,为什么不在调用执行后立即将意图传递给另一个活动,而不是finish();
  • 使用IntentService
【解决方案2】:

我不认为AsyncTask 是在这里使用的正确类。我认为您应该改用IntentService,原因如下:

  1. Services 具有更高的进程优先级,这意味着托管活动Services 的进程不太可能被系统杀死。换句话说,在Activity 中使用AsyncTask 风险更大,因为系统更有可能在内存不足的情况下杀死您的应用程序进程。

  2. 您无需担心泄露 Activity 上下文(因为 Service 不直接绑定到 Activity 生命周期)。

  3. 它是即时的 - 您无需使用 Dialog 阻止用户界面并等待任务完成。您可以使用IntentService 将要执行的任务排队,然后立即离开Activity,该任务最终将异步执行。

【讨论】:

  • 我要补充一点,您的错误报告可能应该是通知而不是对话框。弹出错误对话框时,用户甚至可能没有使用您的应用程序。太粗鲁了。
【解决方案3】:

在您的 Activity 中,调用 this.getApplicationContext() 以获取将在 Activity 生命周期之后存在的上下文。

【讨论】:

  • 但 linus 的回答更好。
猜你喜欢
  • 2016-08-31
  • 2013-05-31
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多