android - Android中的共享数据和多线程

标签 android multithreading storage

我想添加一个 SyncAdapter到我的应用程序以使用最少的电池更新服务器端数据。为此,我需要让我的应用程序的主要 Activity 将数据写入某个共享存储位置,然后 SyncAdapter 可以在 onPerformSync(...) 中读取该位置。方法。

我正在尝试找出最适合存储这些数据的位置并有以下问题:

  • 当我的主要 Activity 在前台线程中执行时,是否可以在后台线程中调用 SyncAdapter? IE。我是否需要担心 SyncAdapter 和我的主要 Activity 之间的存储访问的线程安全性?
  • 是否存在我的主要 Activity 的两个实例可能在 "Created" 中的情况?状态? IE。我是否需要担心我的主要 Activity 的两个实例之间的线程安全?

假设我确实需要担心任何类型的线程安全,我有以下关于 the different data storage options 的问题:

  • Files in internal storage :
    • 我可以对内部存储中的文件执行任何原子操作吗?
    • 文件锁怎么样?
  • SharedPreferences :
    • 如果两个editors在不同的线程中同时修改 Shared-Preferences 中的 different!!! 键,两个同时提交是否会导致其中一个更改丢失?
  • SQL database :
    • 如果我同时从不同线程打开同一个 SQL Lite 数据库文件,Android SQL Lite 框架是否线程安全?
  • 是否有其他方法可以在 SyncAdapter 和(多个实例(如果可能的话))主要 Activity 之间共享数据?

另外:为了最大限度地提高我的应用的兼容性,我不想使用任何高于级别 5 的 API。

最佳答案

认为,应该可以通过使用 ContentProvider 来解决这个问题。 .

如文档中所述,ContentProvider 本身并不能解决多线程问题:

Data access methods (such as insert(Uri, ContentValues) and update(Uri, ContentValues, String, String[])) may be called from many threads at once, and must be thread-safe. Other methods (such as onCreate()) are only called from the application main thread, and must avoid performing lengthy operations. See the method descriptions for their expected thread behavior.

但是,除非 ContentProvider 声明为 android:multiprocess=true应该只有一个 ContentProvider 实例(如果我理解正确的话),或者至少所有实例都将存在于同一个进程中,即它们应该有访问类定义中相同的static 字段。

有了这个,应该可以使用 standard Java synchronization features管理对存储支持资源的访问。

如果我遗漏了什么,请评论...

旁白:为什么都是“应该”?
因为,不幸的是,对于 Android 的文档,我永远无法 100% 确定它的可靠性或完整性。这里的示例:上面的引述指出“[o]其他方法(例如 onCreate()) 仅从应用程序主线程调用”......当我设置 android:multiprocess=true 时会发生什么?那里的文档指出“如果此标志设置为'true',系统可以在每个有客户端想要与之交互的进程中创建一个实例”。这会导致从应用程序主线程以外的线程调用 onCreate() 吗?大概……

关于android - Android中的共享数据和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33684401/

相关文章:

java - 主要 Activity 请求构造函数 - 第二个 Activity 不在 list 文件中

android - 如何保存相机实例?

java - 如何在 JSONArray 中正确嵌套数组

java - 优雅地中断java线程

javascript - 如何在客户端存储持久数据

php - php 超全局变量存储并可供应用程序访问多长时间?

uwp - 调试时访问模拟器/设备的存储

java - 如何禁用 AlertDialog 中的按钮?

c# - 如何将 Log4Net 包装类作为单例类?

java - 如何检查我的线程是否正在运行 Java