Android

时间:2015-11-13 01:18:48

标签: android multithreading storage

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

我正在尝试找出最适合存储此数据的位置,并提出以下问题:

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

假设我必须担心任何类型的线程安全,我对the different data storage options提出以下问题:

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

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

1 个答案:

答案 0 :(得分:1)

认为,应该可以使用ContentProvider解决此问题。

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

  

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

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

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

如果我遗漏了某些内容,请发表评论......

旁白:为什么所有"应该"? 不幸的是,由于使用了Android的文档,我绝不会100%确定它的可靠性或完整性。这里的示例:上面的引用声明" [o]其他方法(例如onCreate())仅从应用程序主线程调用" ...当我设置android:multiprocess=true时会发生什么?那里的文档声明"如果此标志设置为“真实”,则系统可以在每个进程中创建一个实例,其中客户端希望与其进行交互"。这会导致从该应用程序的主线程以外的线程调用onCreate()吗?也许...