SharedPreferences是一种在服务和UI之间共享设置的安全方式吗?
我在服务中调用commit(),当我在300毫秒后读取UI中的prefs时,数据不存在。这是在API 27上。
我已经使用Messenger在服务和UI之间进行通信。
这就是我在服务端存储数据的方式:
local e = context:getSharedPreferences("characters", context.MODE_PRIVATE):edit()
e:putString("list", table.concat(names, "|"))
log("saved these names in characters: %s", tstring(names))
e:commit()
local stuff = context:getSharedPreferences("characters", context.MODE_PRIVATE)
在UI中检索它:
charlist_settings = activity:getSharedPreferences("characters", activity.MODE_PRIVATE)
log("refreshlist hit")
if charlist_settings:contains("list") and charlist_settings:getString("list", "") ~= "" then
[...]
else
log("no list in char_settings :(")
log("all: %s", charlist_settings:getAll():toString())
end
服务日志,通知时间戳:
12-22 18:56:30.246 4142-4142/org.vadisystems.irehelper:Service I/IRE Helper: modified is: added
12-22 18:56:30.253 4142-4142/org.vadisystems.irehelper:Service I/IRE Helper: saved these names in characters: {"Vadimuses_Achaea"}
UI日志,这是在从服务收到消息之后:
12-22 18:56:30.700 4120-4120/org.vadisystems.irehelper I/IRE Helper: refreshlist hit
12-22 18:56:30.701 4120-4120/org.vadisystems.irehelper I/IRE Helper: no list in char_settings :(
12-22 18:56:30.702 4120-4120/org.vadisystems.irehelper I/IRE Helper: all: {}
这应该工作,使用基于文档的commit()或apply()。应该在所有进程内线程和组件之间立即显示更改。但是我注意到Android中的错误在过去尝试在服务和活动之间执行此操作。您尝试使用getDefaultSharedPreferences()
而不是自定义文件。我使用默认文件没有问题。
甚至没有重新启动活动就可以在提交数据后获取数据。唯一能做的就是完全重启应用程序。这是在API 27上。
当动作完成时,使用本地广播接收器进行广播。在监听方面,你有一个负责持久化到SharedPreferences的类,并且UI可以有一个单独的监听器并自行更新。
[编辑]建议使用apply vs commit作为依赖于内存缓存层的快速解决方法,结果不是由SharedPreferences提供的,我们正在调整此答案以使用本地广播接收器。