3

我的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 进行数据库访问。

4

3 回答 3

2

看起来如果我onPause()在我的活动中覆盖事件,并从被覆盖的onPause()中调用cancel(false)AsyncTasks那么活动在AsyncTasks完成之前不会被破坏。

于 2012-08-07T22:05:46.570 回答
0

您可以随时核对AsyncTask.getStatus()AsyncTask.Status.RUNNING

也许你需要让你的活动和你的 AsyncTask 互相了解,正如这个问题中所问的那样AsyncTask 在概念上真的有缺陷还是我只是错过了什么?@hackbod 的回答准确地解释了如何

于 2012-08-06T16:19:56.507 回答
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. AsyncTask 类必须在 UI 线程上加载。这是从 JELLY_BEAN 自动完成的。

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

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

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

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

于 2012-08-06T17:26:49.140 回答