3

在我的一个 onTouch() 侦听器中,我目前在决定如何处理触摸事件之前检查布尔用户设置:

boolean shouldCue = preferences.getBoolean(v.getContext().getString(R.string.should_cue), true);

观察 LogCat 可以看到,当用户触摸屏幕时,这个语句被调用了无数次!

shouldCue因此,我正在考虑通过实现onSharedPreferenceChanged()侦听器来“缓存”该布尔值。

我当然可以继续实现这一点,然后……在我的超快 Android 设备上观察到可以忽略不计的差异。我不可能在“大多数安卓设备”上测试这个,因为有太多的变化。

所以我的问题是:

  1. 即使未通过 UI 更改首选项,是否会调用onSharedPreferenceChanged () ?(即通过编程方式editor.commit();
  2. 如果 SharedPreferences boolean 可以从 UI 或以编程方式修改(但不能同时进行),缓存它会强制 @Synchronized处理吗?
  3. 关于缓存与非缓存方法之间的性能差异的任何估计?(为了简化问题,假设我们指的是像 Droid 1 A855 这样的旧手机)
4

1 回答 1

2

在我看来,最好避免在 onTouch() 方法中读取首选项:它触发得非常快,从首选项中读取意味着解析 xml(这不完全是你应该每秒做这么多次的事情)。您可以在模拟器上尝试一下,看看它的反应是否足够快,但最好在其他地方阅读或找到另一种存储/获取此布尔值的方法。

编辑:关于问题:

1) 是的,即使偏好完全没有改变

2)是的,它可以以这种方式实现,但这可能会导致很多问题,特别是如果您打算重用视图

3) 由于许多因素(硬件、操作系统版本、启用 jit 等),我无法准确估计对其他设备的影响,但如果没有基准测试,缓存方法似乎是最有效的。

您真的必须在 onTouch() 方法中操作该布尔值吗?在这种情况下,为什么不定义 hooks 或 listeners 呢?

于 2012-06-19T16:45:16.573 回答