代码之家  ›  专栏  ›  技术社区  ›  Jeff Axelrod

如何确保在我的活动终止之前完成AsyncTask?

  •  3
  • Jeff Axelrod  · 技术社区  · 13 年前

    我得到了一个 Unable to destroy activity xxx: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements 我的活动被破坏时出错。我想这是因为我在AsyncTasks中执行数据库操作,而它们在完成之前就被杀死了。

    我如何确保 AsyncTasks 在活动停止之前实际完成?顺便说一句,我认为 AsyncTask 如果没有 异步任务 通过检查同意这样做。

    该错误可能发生在Robotium集成测试期间。我怀疑这是在测试完成并调用测试之后发生的 Robotium.finishOpenedActivities() 。我的猜测是 异步任务 如果可能的话,在执行过程中被强行杀死(尽管我在 异步任务 实施)。此外,我使用OrmLite进行数据库访问。

    3 回复  |  直到 13 年前
        1
  •  2
  •   Jeff Axelrod    13 年前

    看起来如果我覆盖 onPause() 在我的活动中的事件,并且从重写的 on暂停() ,我打电话 cancel(false) AsyncTasks ,则直到 异步任务 完成。

        2
  •  0
  •   Community Mohan Dere    8 年前

    你可以检查 AsyncTask.getStatus() 反对 AsyncTask.Status.RUNNING 任何时候。

    也许您需要像本问题中所问的那样,让您的活动和AsyncTask相互了解 Is AsyncTask really conceptually flawed or am I just missing something? @hackbod的回答准确地解释了

        3
  •  0
  •   Jeff Axelrod    13 年前

    您可以在这里做以下几件事:

    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. execute(Params…)必须在UI线程上调用。

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

      5. 任务只能执行一次(如果尝试执行第二次,则会引发异常)

    推荐文章