gpt4 book ai didi

java - 等待传感器数据 android - 我们总是需要一个新线程吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:17 25 4
gpt4 key购买 nike

我有一个简单的 Android 应用程序,它应该以一定的时间间隔从传感器获取多个读数。
我目前有两个线程:

  1. UI 线程启动序列(通过向工作线程处理程序发送消息),并跟踪其状态(无论我是进行第一次测量,还是重复测量)。

  2. 工作线程,在后台运行并通过主线程处理程序与主线程通信。

我的目的是将有关何时进行测量的所有逻辑保留在主 UI 线程中(这些是简单的数字比较,并且不耗时,因此应该适合 UI 线程),并将工作线程设置为只知道如何响应从传感器读取数据的请求并返回读取结果的线程。

我的问题出在这个工作线程中。它通过消息接收进行测量的请求,并在其handleMessage方法中处理该请求:

public boolean handleMessage(Message msg) {
if (msg.what == StartMeasurementCmd) {
Log.d(TAG, "Starting measurement");
// register sensor event listener
// wait for onSensorChanged
// unregister sensor event listener
Log.d(TAG, "Measurement finished");
// Notify UI thread via uiHandler
Message newMsg = uiHandler.obtainMessage();
newMsg.what = DoneMeasurementCmd;
// add whatever information is needed to the newMsg
newMsg.setTarget(uiHandler);
newMsg.sendToTarget();
}
return false;
}

这里 StartMeasurementCmd 和 DoneMeasurementCmd 是简单常量。

一旦工作线程收到测量数据的请求,它需要注册一个传感器监听器(上面的第一条注释行),但随后它需要等待直到读数可用(上面的第二条注释行)。读取可用后,它将取消注册监听器(上面的第三条注释行),并向 UI 线程发送消息以通知新数据可用。我可以想到两种方法来填写第二个注释行:

  1. 我可以在另一个线程中进行读取(然后只需使用 wait() 来同步该工作线程) - 基于这两篇文章:

Android sensor registerListener in a separate thread

A method for waiting for sensor data

  • 或者,我可以简单地在注册监听器后放置一个 while 循环,并检查可以在 onSensorChanged 方法中触发的标志。由于工作线程在后台运行,因此应该可以阻止它,但我不喜欢我使用“忙”等待这一事实。
  • 我的问题是 - 有没有办法在同一个工作线程中获取读数,但无需在 while 循环中进行“忙”等待?或者上述方法之一实际上是推荐的方法?

    谢谢!

    最佳答案

    如果我理解正确的话,阻塞工作线程是可以的。那么您不需要单独的线程,只需使监听器对象成为一个监视器(即使用同步方法)并等待即可。

    例如,类似的内容(粗略地概述了实际数据的处理):

    class ListenerMonitor implements WhateverListenerInterface {

    private boolean gotData;
    ... some variable(s) to record the actual data

    public synchronized void onSensorChanged(...) {
    ...
    gotData=true;
    notifyAll();
    }

    public synchronized SuitableReturnType readSensor(...) throws InterruptedException {
    // register sensor event listener
    gotData = false;
    while(!gotData) wait();
    // unregister sensor event listener
    return the data?
    }
    }

    并在工作线程中使用它:

    ...
    ListenerMonitor listenerMonitor = new ListenerMonitor(...);
    ...
    public boolean handleMessage(Message msg) {
    if (msg.what == StartMeasurementCmd) {
    Log.d(TAG, "Starting measurement");
    ... = listenerMonitor.readSensor(...);
    Log.d(TAG, "Measurement finished");

    关于java - 等待传感器数据 android - 我们总是需要一个新线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30093483/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com