对于我正在编写的应用程序,我目前在并发保存到 sqlite 数据库时遇到问题。
情况如下:
我有一个列表视图,当它被单击时,该项目被标记为同步。一个标志被保存到数据库中。此外,然后启动一个异步线程,该线程从服务器检索数据,然后将其本地保存到 sqlite 数据库。
在此期间,可以单击其他列表项,这会将它们标记为同步(并写入一个需要同步到数据库的标志)
如果用户离开应用程序或应用程序被终止,则需要该标志,项目被标记为同步但尚未同步。
从 ui 线程调用的代码:[从 UI 线程执行]
Project p = (Project) obj;
if (p.getDoSync() == 0){
p.setDoSync(1);
p.save();
}
此代码可以与以下代码同时执行,该代码位于异步方法中:
[从异步方法执行]
for (Project project : ProjectRepository.forSyncStatus(SyncStatus.NEEDS_SYNC)){
try {
db.beginTransactionNonExclusive();
project.sync();
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
我们正在处理大量带有嵌套对象的 json 数据。project.sync() 解开 json 并从中创建 java 对象并保存它们。所以一个 project.sync(); 本身包含多个插入。
问题不是应用程序崩溃,而是 UI 冻结。如何防止 UI 冻结?我现在完全不知所措。
[编辑] 我做了一些实验。问题是交易。然而,该交易是必要的,否则 project.sync(); 需要很长时间。没有事务就没有 UI 冻结。