gpt4 book ai didi

java - 关键部分在 onSensorChanged() 中不起作用

转载 作者:行者123 更新时间:2023-12-01 05:11:48 28 4
gpt4 key购买 nike

我是 Android 开发新手。我正在构建一个简单的 Android 应用程序,它分析加速计传感器数据并使用 MediaPlayer 播放声音。 SensorEventListener 实现代码:

    class AccelListener implements SensorEventListener {
boolean firstUpdate = true;
volatile boolean stopped = true;
private MediaPlayer mplayer;
//some variables to store calculations

public AccelListener(MediaPlayer mediaplayer) {
mplayer = mediaplayer;
mplayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
if (mplayer == mp) {
synchronized (AccelListener.this) {
stopped = true;
}
Log.d("MediaPlayer Callback", "stopped=" + stopped);
}
}
});
}

public void onSensorChanged(SensorEvent event) {
updateAccel(event.values);
if (isAccelChanged()) {
Log.d("Accel Listener", "stopped_before=" + stopped);
synchronized (this) {
if (stopped) {
stopped = false;
firstUpdate = true;
mplayer.start();
Log.d("Accel Listener", "stopped_after=" + stopped);
}
}
}
}
}

问题是,当我启动应用程序并开始摇动手机时,声音会同时播放多次。音频文件大约有 3-4 秒长,因此不可能播放到最后然后对下一次摇晃使用react。

Logcat 显示以下内容:

08-12 22:16:24.693: D/Accel Listener(5382): stopped_before=true
08-12 22:16:24.693: D/Accel Listener(5382): stopped_after=false
08-12 22:16:24.693: D/Accel Listener(5382): stopped_before=true
08-12 22:16:24.703: D/Accel Listener(5382): stopped_after=false
08-12 22:16:28.777: D/MediaPlayer Callback(5382): stopped=true
08-12 22:16:28.777: D/MediaPlayer Callback(5382): stopped=true

onSensorChanged()onCompletion() 中的关键部分被锁定在同一个对象上(我只创建了一个 AccelListener 实例)程序),因此不应该有对 stopped 的并行访问。

此外,该变量被声明为 volatile ,因此任何输入关键值的人都应该拥有一个新的、最新的值。但看起来两个不同的线程实际上同时进入临界区,并且都具有相同的标志值。怎么会发生这种事,我哪里错了?

附注那家伙here似乎有同样的问题,但针对他的情况的解决方案(例如在单独的对象上同步或使用 MediaPlayer 的相同实例)对我来说都不起作用。

最佳答案

假设您进入“isAccelChanged() if”内部,则无论stopped的值如何,您总是在“onSensorChanged”内启动播放器中的声音(它超出了if,并且超出了同步块(synchronized block)) )。

如果您确定只有一个实例,您可以删除“同步”。

查看并回复。

关于java - 关键部分在 onSensorChanged() 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11924873/

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