0

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

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

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

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

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

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

4

3 回答 3

2

也许您不应该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?
}
于 2013-08-29T16:31:20.953 回答
1

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

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

  2. 您无需担心泄露活动上下文(因为它与生命周期Service没有直接关联Activity)。

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

于 2013-08-29T16:41:05.123 回答
0

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

于 2013-08-29T16:31:51.083 回答