android进程内存线程堆栈,java - 等待android的传感器数据-我们是否总是需要一个新线程? - 堆栈内存溢出...

博客讨论了在Android应用中,如何在后台工作线程中有效地处理传感器数据的读取,避免UI线程阻塞。作者提出了在工作线程中等待传感器数据的两种方法:使用额外线程进行读取或在工作线程中使用忙等待。作者寻求一种避免忙等待的方法,以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个简单的Android应用程序,该应用程序应在特定时间间隔内从传感器获取多个读数。

我目前有两个线程:

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

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

我的意图是保留有关何时在主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线程发送消息以通知新数据可用。 我可以想到两种方式来填充第二条评论行:

我可以读入另一个线程(然后简单地使用wait()同步此工作线程)-基于以下两个帖子:

另外,我可以在注册侦听器后简单地放置一个while循环,然后检查一个可以在onSensorChanged方法中触发的标志。 由于工作线程在后台运行,应该可以阻止它,但是我不喜欢我正在使用“忙”等待这一事实。

我的问题是-有没有一种方法可以在同一工作线程中获取读数,而无需在while循环中进行“繁忙”的等待? 还是上述方法之一实际上是推荐的方法?

谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值