我的活动被销毁时出现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进行数据库访问。
答案 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)
你可以在这里做几件事:
覆盖这些方法,并确切了解对象在关闭时的状态。似乎onPostExecute将在AsyncTask完成时被调用。如果它还没有被称为太早。
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
}
您也可以按如下方式执行:
// with THREAD_POOL_EXECUTOR.
executeOnExecutor(java.util.concurrent.Executor, Object[])
确保您遵循文档中的前两条规则:您是否关注1和2?
此类必须遵循一些线程规则才能正常工作:
必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。
必须在UI线程上创建任务实例。
execute(Params ...)。
不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。
该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)