【问题标题】:Android - sqlite content providers and multithreadingAndroid - sqlite 内容提供程序和多线程
【发布时间】:2011-10-18 06:34:12
【问题描述】:

我对内容提供商有点困惑。 如果我的应用程序中有多个活动,它们是否每个都有自己的内容提供者实例?它本质上只是一个类/接口?

在一项活动中,我将有许多线程同时写入数据库。如何处理一次允许一个线程写入?

我是否只是捕获 SQLiteDatabaseLockedException,让线程休眠然后重试? 还是有更好的办法?

活动暂停/销毁时是否释放数据库锁?如果是这样,我是否可以针对内容提供者本身创建一个同步锁?

【问题讨论】:

    标签: android sqlite android-contentprovider


    【解决方案1】:

    如果您直接使用数据库并且有来自不同线程的多个写入器,您可能会遇到并发问题。

    ContentProvider 可以同时被多个程序访问,因此必须实现访问线程安全。最简单的方法是在ContentProvider的所有方法前面使用关键字synchronized,这样就只有一个线程可以同时访问这些方法。

    如果您不要求 Android 同步对 ContentProvider 的数据访问,请在 AndroidManifest.xml 文件的 <provider> 定义中设置 android:multiprocess=true 属性。这允许在每个客户端进程中创建提供程序的实例,从而无需执行进程间通信 (IPC)。

    【讨论】:

    • 我不明白,所以如果我不设置 multiprocess=true android 将同步所有对 ContentProvider 的访问?在这种情况下,没有必要使用 synchronized 关键字,对吗?在这种情况下,费米的答案是正确的?
    【解决方案2】:

    糟糕,我丢失了未注册的用户 cookie,因此无法投票给 Femi 的答案。

    文档http://developer.android.com/guide/topics/providers/content-providers.html 证实了这一点 “发起查询时,Android 系统会识别作为查询目标的内容提供程序,并确保它已启动并运行。系统会实例化所有 ContentProvider 对象;您永远不需要自己做。事实上,您根本不会直接处理 ContentProvider 对象。通常,每种类型的 ContentProvider 只有一个实例。但它可以与不同应用程序和进程中的多个 ContentResolver 对象进行通信。进程之间的交互由 ContentResolver 和 ContentProvider 类处理。 "

    【讨论】:

    • 如果您标记您的问题/答案以引起版主注意并选择其他,您可以请求合并两个帐户。您可能还想考虑注册:)
    【解决方案3】:

    如果您使用的是 ContentProvider,我相信您并不关心有多少线程正在读取/写入:Android 平台会处理将您的所有调用编组到单个线程并整理同步和锁定。您只需打开数据库并对其进行读/写,其他人都通过 ContentProvider 接口进行对话。

    【讨论】:

    • Android 文档 "因为这些 ContentProvider 方法可以从不同进程和线程中的各种 ContentResolver 对象调用,所以它们必须以线程安全的方式实现。"
    • 嗯,声望50.5k还有这样的答案?
    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多