【问题标题】:Android: Which thread calls .onSensorChanged?Android:哪个线程调用.onSensorChanged?
【发布时间】:2013-07-17 00:27:03
【问题描述】:

我已经阅读了一些关于哪个线程调用各种回调方法的讨论,例如与传感器相关的那些。大多数人声称 UI 线程调用回调 - 即使涉及单独的工作线程。我们确定吗?

考虑这种情况:一个单独的类实现了 Runnable 和 SensorListener。 UI 线程(在 onCreate 期间)启动可运行对象,然后返回到其他业务。现在独立的工作线程在其自己的类中注册 SensorListener。

请注意,UI 线程永远不会与 SensorManager 或 SensorListener 进行任何交互。唯一与 Sensor 相关的线程以及它所知道的唯一类和成员方法是工作线程及其类。

我很难想象 UI 线程会在这种情况下调用回调。然而,在线讨论相当“自信”。有谁知道吗?

谢谢!

【问题讨论】:

  • 它可能是,但我建议不要依赖这个,因为如果它不在文档中,它可能会改变。

标签: android multithreading callback sensors runnable


【解决方案1】:

我们确定吗?

是的,不过这取决于您如何注册侦听器,并且该行为并没有特别详细的记录。

有两个registerListener() 方法采用SensorEventListener。一个接受Handler,另一个没有。后者将使用与主应用程序线程关联的Handler。如果您希望将事件传递到后台线程,请使用HandlerThread(实际上应该称为LooperThread,但他们没有问我......),在其中创建一个Handler,然后使用HandlerregisterListener()

【讨论】:

  • 我一直在玩的是>>public boolean registerListener (SensorEventListener listener, Sensor sensor, int rate)
  • @AndroidNewbie:欢迎您在闲暇时查看源代码for SensorManagerthe concrete implementation SystemSensorManager。在幕后,Android 目前为每个侦听器创建一个 Handler,使用该 Handler 在所需线程上调度事件。
  • 感谢您的参考,我会深入研究它。当您说“在 DESIRED 线程上”(强调我的)时,它是否迫使它成为 UI 线程?非 UI 线程也可以支持 Handler。这种情况让我很担心,因为感觉可能存在线程安全和同步问题,如果尽管一切都是由工作线程设置的,那么 UI 线程就是调用回调的线程。如果该回调方法是某个单独类的成员,那么您基本上将有两个线程在一个公共实例中工作。
  • 线程同步不是很明显是必要的。事实上,实例化一个完全独立的实现 Runnable 的类,并为其创建一个专用线程,并不能完全说其他线程可以访问该类的私有变量,但这正是会发生的事情!
  • @AndroidNewbie:“这是否迫使它成为 UI 线程?” - 请重新阅读我的答案。如果您使用三参数registerSensorListener()SystemSensorManager 将在主应用程序线程的Looper 上创建一个Handler,其中Looper 通过ContextImpl 传递给SystemSensorManager 构造函数。您可以通过阅读 Android 框架源代码来了解这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多