在我的Android应用程序中,用户在“创建项目”页面创建某个项目,当他们点击完成时,我让他们继续使用该应用程序。
同时,在一系列asynctasks中,我执行以下数据库操作:
这需要2-10秒,当这些操作正在运行时,用户会尝试打开“我的项目”屏幕或“我的个人资料”
问题是两个屏幕在加载之前从DB读取信息。
前面提到的操作在后台运行,但是“我的项目”无法访问数据库以获取项目或“我的个人资料”无法访问数据库中的项目。
我该怎么办?
最简单的解决方案是在这些操作正在运行时显示加载程序并让用户等待,这可能需要一段时间,尤其是在上传图像和网络是移动时。
编辑:我可以设置数据库操作的优先级吗?
答案 0 :(得分:1)
您是否可以将BLOB写入数据库 - 我认为该操作长时间锁定数据库?是否值得将该图像存储在BLOB中,或者您可以将其写入磁盘并在数据库中保留文件路径引用吗?
假设您可以让数据库至少允许您在上传时阅读(看起来很奇怪它完全锁定那么久): 如果您让用户继续使用该应用,但在图片无法上传的情况下,您无法将该项目标记为"未完成同步" (或者某种类似的措辞)在数据库中,当用户打算“我的项目”时,#34;或者任何屏幕需要来自该数据库的项目,通过使用加载微调器或其他东西将其显示为灰色来向他们显示该项目是否已完成。就像Instagram上传一张照片一样。
//编辑误读实际锁定的内容
答案 1 :(得分:1)
只需一次上传一个并使用乐观锁定进行数据库更新
答案 2 :(得分:1)
创建缓存。将所有内容放入其中并让您的“我的项目”和“我的个人资料”从中读取。如果您已更改任何内容或更新数据库中的任何值,请更新您的缓存(如果您的活动需要它们)。我不确切知道您的数据的依赖性,但我认为它适用于任何情况。
答案 3 :(得分:1)
我认为最干净的方式是改变您的架构。您可以创建一个服务,对用户请求进行排队并对其进行管理,而不是使用多个AsyncTasks。你甚至可以将服务分成两部分。一个用于从用户输入更新本地数据库,另一个用于与远程服务器同步(请考虑在此处使用SyncAdapter)。这样,Loaders只需要加载一些数据。如果来自服务的操作完成,您可以使用通知机制来更新加载器。这就是它们的使用方式。
基本上,您在向用户展示内容之前所做的操作应该尽可能快。考虑只执行一次长时间运行的操作,并在其他地方执行。
构建高效的Android架构需要一些开销,但如果你想构建一个顶级的应用程序,那么就无法解决它。
以下是一些额外的指示: https://www.youtube.com/watch?v=xHXn3Kg2IQE Virgil Dobjanschi讨论了" Android REST客户端应用程序"在2010年Google I / O上。 关于"企业Android"中的强大网络架构的章节是基于谈话。本书还提供了一些示例代码:http://www.wrox.com/WileyCDA/WroxTitle/Enterprise-Android-Programming-Android-Database-Applications-for-the-Enterprise.productCd-1118183495,descCd-DOWNLOAD.html 这可能有助于作为一个起点。
免责声明:我与作者或出版商无关联
答案 4 :(得分:1)
我建议您将数据库包装在ContentProvider中,其中applyBatch方法支持发送操作列表(ContentProviderOperation)以执行数据库(插入/更新/删除等) )。然后我会建议你在你的"我的物品"中使用ContentObserver聆听。屏幕或"我的个人资料"在更新要执行的不同数据库的提供程序URI上,并在发生更改时更新屏幕(将值缓存到不必一直重绘)。