如何确保一个AsyncTask在我的Activity被销毁之前完成?

3
我在销毁活动时遇到了一个错误:android.database.sqlite.SQLiteException: unable to close due to unfinalised statements,我猜测这是因为我在AsyncTasks中执行数据库操作,但它们在完成之前就被终止了。如何确保我的AsyncTasks在活动停止之前实际完成?顺便说一下,我认为如果AsyncTask同意检查,它不能被显式地杀死。这可能与Robotium集成测试有关,在测试完成并调用Robotium.finishOpenedActivities()后发生错误。我猜测如果可能的话(尽管我没有在AsyncTask实现中明确支持取消),某种方式强制停止了AsyncTask的执行。此外,我使用OrmLite进行数据库访问。

可能与此有关。无法关闭,因为存在未完成的语句(Android)。 - DeeV
我们需要了解一下AsyncTask是如何被创建的。 - Code Droid
@CodeDroid 请查看我问题的最后一段的修改。 - Jeff Axelrod
弹出ProgressDialog并不意味着阻塞UI线程,它是一种友好的方式告诉用户等待(重要任务完成)。可以这样想,它暂停了用户的交互,而不是UI线程。在应用程序首次启动时进行数据库构建等情况下,这被广泛使用等。 - yorkw
你能发一下你的AsyncTask代码吗?我觉得你可能是在错误的方向上进行处理... 与其试图延迟Activity的销毁,你应该更关注在AsyncTask内部所创建/打开的资源。 - Alex Lockwood
显示剩余2条评论
3个回答

2

看起来,如果我在我的activity中重写onPause()事件,并从重写的onPause()中调用AsyncTasks的cancel(false)方法,那么直到AsyncTasks完成之前,该activity不会被销毁。


这似乎可以工作,但问题在于当asyntask完成时,它不再调用onPostExecute..这是因为我在activity的onPause中放置了cancel(false); - yeahman

0

这里有几件事情可以做:

  1. 重写这些方法并确切确定对象关闭时的状态。当AsyncTask完成时,似乎将调用onPostExecute。如果它还没有被调用,那太早了。

    protected void onProgressUpdate(Integer... progress) {
       setProgressPercent(progress[0]);
    }
    
    protected void onPostExecute(Long result) {
    }
    
  2. 你也可以使用以下方式执行:

    // with THREAD_POOL_EXECUTOR.
    executeOnExecutor(java.util.concurrent.Executor, Object[]) 
    
  3. 确保你遵循文档中的前两条规则:你是否正在遵循1和2?

    这个类要正常工作必须遵循一些线程规则:

    1. AsyncTask类必须在UI线程上加载。自JELLY_BEAN以来,这已经自动完成。

    2. 任务实例必须在UI线程上创建。

    3. execute(Params...)必须在UI线程上调用。

    4. 不要手动调用onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...)。

    5. 该任务只能执行一次(如果尝试执行第二次将抛出异常)。


是的,我遵循这些规则。正如我在原始问题中所写的那样,我认为问题是由于我的集成测试调用activity.finish()导致AsyncTask被杀死而未能完成。我看不出为什么在应用程序部署后,在低内存/后台条件下也不会发生这种情况。 - Jeff Axelrod

0

@Jeff Axelrod,不,虽然使用getStatus()进行检查是可能的,但我认为在UI线程中保持任何东西都不是一个好主意。我认为,如果您像hackbod在那个答案中提出的那样做,那么您的问题将会消失。因为当需要时,您的AsyncTask将获得一个新的活动,并且因为您也将把任何正在运行的AsyncTask传递给一个新的Activity。 - Alexander Kulyakhtin
@Jeff Axelrod 我相信问题在于无效的上下文。 - Alexander Kulyakhtin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接