当前位置: 首页 > 知识库问答 >
问题:

Android AsyncTask锁数据库

丌官坚秉
2023-03-14

我有片段,我在每个片段中缓存数据。我将数据缓存在AsyncTask中,方法是从服务器上以doInBackground方法下载数据,并将其保存在onPostExecute中到我的数据库中。因此,我总是在onPostExecution中打开数据库连接。如果我滚动“fast”并抛出片段,我认为AsyncTasks会传递预览实例,并且在我打开连接的行中会出现一个<code>android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)(获取<code>dbHelper.getWritableDatabase()

我认为有两种方法可以解决这个问题:

>

  • onPostExecution 方法必须等到预览 AsyncTask (onPostExecution) 完成

    有一种方法可以对AsyncTask的所有实例使用相同的数据库连接,而无需相互锁定它们

    这是正确的吗?有人出主意了,怎么做呢?

  • 共有2个答案

    许正平
    2023-03-14

    我想你要找的所有信息都可以在这个帖子上找到:

    Android 上的 SQLite 的最佳实践是什么?

    至于您使用onPostExecution将数据保存在db上,由于SQLiteDatabase类是线程安全的,因此如果您在doInbackground方法中执行此操作,您的应用程序将更快(并且仍然安全)。

    请记住,如果保存数据是由多个sql查询组成的,那么很容易通过使用事务来确保它们是自动执行的(没有其他线程的干扰):

    Android开发者网站上的SQLiteDatabase的()

    不管怎样,应该使用哪个btw(在单个事务中插入1000行可以大大加快速度)

    希望这有所帮助

    东龙野
    2023-03-14

    我建议您使用Loader而不是AsyncTask在后台加载数据。否则,您必须管理游标,与UI线程正确同步,并确保所有查询都发生在后台线程上。此外,极不鼓励使用现在已弃用的startManagingCursor和managedQuery方法;它们会减慢你的应用程序的速度,并可能使它突然停止。

    Android 3.0引入了Loader和LoaderManager类来帮助简化过程。这两个类都可以在Android支持库中使用,该库支持Android 1.6之前的所有Android平台。

    加载器确保所有游标操作都是异步完成的,从而消除了阻塞UI线程的可能性。此外,当由LoaderManager管理时,加载器在整个活动实例中保留其现有的光标数据(例如,当由于屏幕旋转而重新启动时),从而避免了不必要的、潜在昂贵的重新查询。作为额外的好处,加载器足够智能,可以监控底层数据源的更新,并在数据更改时自动重新查询。

    请查看此博客,了解更多关于装载机的信息http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html

    或访问Android开发者的官方文档:http://developer.android.com/guide/components/loaders.html

     类似资料:
    • 问题内容: 我在我的应用程序中做了一些重复的操作(测试),突然我收到一个奇怪的错误: 我已经重新启动服务器,但是错误仍然存​​在。可能是什么呢? 问题答案: 从Django文档中: SQLite是一个轻量级的数据库,因此不支持高级别的并发性。OperationalError:数据库已锁定错误,表明你的应用程序并发性超过sqlite在默认配置下无法处理的并发性。此错误意味着一个线程或进程在数据库连接

    • 我遵循grails文档,它说要做悲观锁定,我可以这样做: 所以这会锁定计划实例,直到保存完成。现在在我的例子中,我想一次锁定多个计划,如下所示: 我在默认情况下是事务性的 grails 服务中执行此操作,但上述行没有按预期工作。它不会锁定所有行,并在执行并发事务时引发。 如何在阅读时锁定多行? 有关更多信息,请参见相关问题:grails中的并发事务导致数据库陈旧状态异常

    • 我使用Spring-Data-Jpa并使用@Lock注释(悲观_写)来获取数据库(Oracle)锁。我需要帮助来了解以下场景是否会导致数据库死锁。 事务1(PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT)将数据库锁定在say教师表上(说锁定在id=1的行上)。它试图在子表中插入一条新记录,比如会议。教师表没有更新 当事务1正在进行时。事务2(PROPAGATI

    • 我正在开发一个以时事通讯风格界面为中心的iPad应用程序。我使用苹果的UIPageViewController来做到这一点。 我遇到了很多我不完全理解的错误,我希望有人能帮助我找到解决方法。 在这个界面上翻页时,应用程序偶尔会冻结(这就是为什么它如此令人沮丧,因为它不容易复制)。我在调试器中暂停应用程序,这是它显示给我的http://cl.ly/image/1y3c2x351t0T. 我很清楚这是

    • 问题内容: 某些数据库功能(例如和)很容易受到死锁的影响,因为数据库未指定将使用哪种锁定顺序。我发现有两次 讨论暗示此行为不是SQL标准指定的,更不用说具体的实现了。因此,我在假设我们无法控制锁定顺序的情况下进行操作(至少,这样做并不明显)。 如果我们不能依赖锁定顺序,应该如何避免数据库死锁? 如果我们不应该避免僵局(您将不得不非常努力地说服我),那么我们应该怎么做? 这个问题与数据库无关,所以请

    • 本文向大家介绍请你介绍一下,数据库乐观锁和悲观锁相关面试题,主要包含被问及请你介绍一下,数据库乐观锁和悲观锁时的应答技巧和注意事项,需要的朋友参考一下 考察点:数据库   悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。悲观锁:假定会发生并发冲突,屏蔽一切可