gpt4 book ai didi

android - 我正在制作一个安卓节拍器应用程序。但是,程序在播放声音时停止

转载 作者:行者123 更新时间:2023-11-29 17:53:53 25 4
gpt4 key购买 nike

当我点击应用程序中的按钮时,它会完美地播放声音。但是,触发启停键和手机返回键可以再次点击,但声音一直在播放。椭圆和电话中均未显示错误消息。

我知道问题出在我的程序被困在播放声音的 for 循环中。但是,如果我想无限循环,我不知道如何在不使用无限循环的情况下实现它。有什么解决这个问题的建议吗?

这个节拍器的声音就像滴答、滴答、滴答、滴答……我想用按钮触发声音。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
final Button button = (Button) findViewById(R.id.startStop);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
boolean start = false;
if (start == false) {
play();
} else if (start == true) {
start = false;
}
}
});

}

public void play() {
final SoundPool sndPool1 = new SoundPool(3, AudioManager.STREAM_MUSIC,
0);
final SoundPool sndPool2 = new SoundPool(3, AudioManager.STREAM_MUSIC,
0);
final int ticks = sndPool1.load(this, R.raw.tick, 1);
final int tocks = sndPool2.load(this, R.raw.tock, 1);
for (;;) {
sndPool2.play(tocks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
sndPool2.play(tocks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
sndPool2.play(tocks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
sndPool1.play(ticks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
}
}

最佳答案

您的问题是您在 UI 线程上运行无限循环。这应该在后台线程中完成。下面是一个使用 AsyncTask 的例子。

public class BackgroundSound extends AsyncTask<Void, Void, Void> {

private Context context;

public BackgroundSound(Context context) {
this.context = context;
}

@Override
protected Void doInBackground(Void... params) {

final SoundPool sndPool1 = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
final SoundPool sndPool2 = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
final int ticks = sndPool1.load(context, R.raw.tick, 1);
final int tocks = sndPool2.load(context, R.raw.tock, 1);
for (;;) {
sndPool2.play(tocks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
sndPool2.play(tocks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
sndPool2.play(tocks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
sndPool1.play(ticks, 1f, 1f, 1, 0, 1f);
LockSupport.parkNanos(((240000 / 200) / 4) * 1000000);
}
}

}

然后像这样调用您的 BackgroundSound 任务:

public class MainActivity extends Activity {

private Activity activity;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
setVolumeControlStream(AudioManager.STREAM_MUSIC);
final Button button = (Button) findViewById(R.id.startStop);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {

new BackgroundSound(activity).execute();
}
});

}
}

关于android - 我正在制作一个安卓节拍器应用程序。但是,程序在播放声音时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20966906/

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