如何确保在我的活动被杀之前完成AsyncTask?

时间:2012-08-06 16:05:08

标签: android android-asynctask android-activity robotium ormlite

我的活动被销毁时出现Unable to destroy activity xxx: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements错误。我认为这是因为我正在从AsyncTasks中执行数据库操作,并且它们在完成之前以某种方式被杀死。

如何确保我的AsyncTasks在活动停止前实际完成?顺便说一句,我认为如果没有AsyncTask同意通过检查,AsyncTask就不能被明确杀死。

在Robotium集成测试期间发生此错误可能是相关的。我怀疑在测试完成并且测试调用Robotium.finishOpenedActivities()之后发生了这种情况。我的猜测是,如果可能的话,AsyncTask在执行中被强行杀死(虽然我没有明确支持在AsyncTask实现中取消)。另外,我使用OrmLite进行数据库访问。

3 个答案:

答案 0 :(得分:2)

如果我覆盖了我的活动中的onPause()事件,并且在被覆盖的onPause()内,我在cancel(false)上调用了AsyncTasks,那么活动就是在AsyncTasks完成之前不会被销毁。

答案 1 :(得分:0)

您可以随时针对AsyncTask.getStatus()查看AsyncTask.Status.RUNNING

也许你需要按照这个问题Is AsyncTask really conceptually flawed or am I just missing something?的要求让你的活动和你的AsyncTask相互了解,而@hackbod的回答确切地解释了

答案 2 :(得分:0)

你可以在这里做几件事:

  1. 覆盖这些方法,并确切了解对象在关闭时的状态。似乎onPostExecute将在AsyncTask完成时被调用。如果它还没有被称为太早。

    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. 必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。

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

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

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

    6. 该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)