gpt4 book ai didi

android - SensorEvent onChanged 多线程?

转载 作者:太空宇宙 更新时间:2023-11-03 13:26:27 39 4
gpt4 key购买 nike

我正在检测设备的方向以检查它是否倒置在表面上,然后调用方法。我遇到的问题是,用户可能会无意中将设备的方向瞬间转向该位置并返回正面朝上的位置以纠正他们的错误,但是该方法在他们第一次这样做时仍会被调用。

我正在尝试在 800 毫秒的延迟上向方向添加“双重检查”,以便用户有时间在触发该方法之前更正方向。不幸的是,我无法控制调用 onSensorChanged 的频率,以便添加一个具有 800 毫秒延迟的线程,这将仔细检查方向以防止无意的方向更改。

我的代码如下,

public SensorEventListener accelerometerListener = new SensorEventListener(){

@Override
public void onSensorChanged(SensorEvent event) {

float z_value = event.values[2];

if (z_value < 0) {
//the device is now upside-down

try {

Thread.sleep(800);

//this if statement is never called correctly because
// onSensorChanged is not called again.
if (z_value < 0) {
toggleMethod();
}

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

我的问题:有没有一种方法可以在 onSensorChanged 方法本身的延迟上调用 onSensorChanged 以执行双重检查?

最佳答案

一个非常简单的方法是让传感器有机会在即将到来的 n 毫秒内给出一个新值(正如所要求的那样)如下:

1- 决定您要给用户多少毫秒以撤消他的操作(您使用了 800):

private static final long TIME_MARGIN_FOR_USER_TO_UNDO = 800;

2- 创建一个处理程序和一个可运行对象来执行您的操作(让它们在比您的 onSensorChanged 更大的范围内 - 例如您的 Activity ):

Handler sensorHandler = new Handler();
Runnable toggleRunnable = new Runnable() {
public void run() {
toggleMethod();
}
}

3- 每当您的 if 语句评估为真时发布此可运行的;但是,在 n 毫秒后发布它。

@Override
public void onSensorChanged(SensorEvent event) {
float z_value = event.values[2];
if (z_value < 0) {
sensorHandler.postDelayed(toggleRunnable, TIME_MARGIN_FOR_USER_TO_UNDO);
}
}

4- 由于传感器值更改时将调用 onSensorChanged,因此如果用户修复了可运行对象,您可以停止运行。因此,您将需要一个 else 语句来删除可运行对象。

@Override
public void onSensorChanged(SensorEvent event) {
float z_value = event.values[2];
if (z_value < 0) {
sensorHandler.postDelayed(toggleRunnable, TIME_MARGIN_FOR_USER_TO_UNDO);
}
else {
sensorHandler.removeCallbacks(toggleRunnable);
}
}

关于android - SensorEvent onChanged 多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18923963/

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