【问题标题】:Shared data and multi-threading in AndroidAndroid中的共享数据和多线程
【发布时间】:2015-11-13 01:18:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: android multithreading storage


    【解决方案1】:

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

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

    数据访问方法(例如insert(Uri, ContentValues)update(Uri, ContentValues, String, String[]))可以同时从多个线程调用,并且必须是线程安全的。其他方法(如onCreate())仅从应用程序主线程调用,必须避免执行冗长的操作。请参阅方法描述以了解其预期的线程行为。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多