在我的一个onTouch()侦听器中,我目前在决定如何处理触摸事件之前检查布尔用户设置:
boolean shouldCue = preferences.getBoolean(v.getContext().getString(R.string.should_cue), true);
观察 LogCat,我可以看到当用户触摸屏幕时,这个语句被调用了无数次!
所以,我正在考虑通过实现onSharedPreferenceChanged()侦听器来"缓存"shouldCue
布尔值。
我当然可以继续实现这一点,并且......在我的超高速Android设备上观察到可以忽略不计的差异。我不可能在"大多数Android设备"上测试这一点,因为有太多的变化。
所以我的问题是:
- 即使首选项没有通过UI更改,也会调用onSharedPreferenceChanged()吗?(即通过
editor.commit();
以编程方式) - 如果 SharedPreferences 布尔值可以从 UI 或编程方式修改(但不能同时修改),缓存它是否强制@Synchronized处理?
- 关于缓存方法与非缓存方法之间的性能差异的任何估计?(为了简化问题,假设我们指的是像Droid 1 A855这样的旧手机)
在我看来,最好避免在 onTouch() 方法中读取首选项:它的触发速度非常快,并且从首选项读取意味着解析 xml(这不是您应该每秒多次执行的操作)。您可以在模拟器上尝试一下,看看它的反应是否足够快,但最好在其他地方阅读或找到另一种方法来存储/获取此布尔值。
编辑:关于问题:
1)是的,即使首选项根本没有改变
2)是的,它可以通过这种方式实现,但这可能会导致许多问题,特别是如果您打算重用视图
3)由于许多因素(硬件,操作系统版本,启用的jit等),我无法准确估计对其他设备的影响,但是如果没有基准测试,缓存方法似乎是最有效的。
你真的必须在 onTouch() 方法中操作那个布尔值吗?在这种情况下,为什么不定义钩子或侦听器?