2

对于我正在编写的应用程序,我目前在并发保存到 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 冻结。

4

0 回答 0