我正在尝试调用线程以使用循环播放声音。看来可以打电话玩了。
但是,我希望能够允许用户单击“暂停”按钮时退出循环。我已经设置了布尔变量“ PauseClicked”以允许这样做。
我想遇到的问题-我不知道如何从主线程更新“ PauseClicked”变量。您知道在循环运行时如何同时从主线程更新此变量吗?
您能提供的任何帮助将不胜感激。我花了很多时间在此上。我不确定的特定代码如下(更新变量的尝试在最后第三行):
// Import statements
public class MyActivity extends Activity {
boolean PauseClicked = false;
// .... Other variables and onCreate....
public void whenPlayClicked(View view) {
new LongOperation().execute("");
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
//Setup playing variables
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume / maxVolume;
float rightVolume = curVolume / maxVolume;
int priority = 1;
int no_loop = 0;
float normal_playback_rate = 1f;
//temporary sleep counters
int blueSleep = (BlueCount * 1000);
int greenSleep = (GreenCount * 1000);
int redSleep = (RedCount * 1000);
int orangeSleep = (OrangeCount * 1000);
int bellSleep = 4000;
int cyclesPlayed = 0;
// Loop - loop until either 1) all cycles have been played. (i.e repeat number of times selected from Spinner).
// or 2)Pause button is clicked.
for (PauseClicked = false; (cyclesPlayed < cycleCount) && (PauseClicked == false); cyclesPlayed++) {
if (blueSleep > 0) {
soundPool.play(blueSoundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
SystemClock.sleep(blueSleep);
}
if (greenSleep > 0) {
soundPool.play(greenSoundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
SystemClock.sleep(greenSleep);
}
if (redSleep > 0) {
soundPool.play(redSoundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
SystemClock.sleep(redSleep);
}
if (orangeSleep > 0) {
soundPool.play(orangeSoundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
SystemClock.sleep(orangeSleep);
}
// CheckForPause();
}
if (TotCount > 0) {
SystemClock.sleep(bellSleep);
soundPool.play(bellSoundID, 0.05F, 0.05F, priority, no_loop, normal_playback_rate);
SystemClock.sleep(bellSleep);
}
return null;
}
@Override
protected void onPostExecute(String result) {
textView2.setText("We are returning from call to ASynch task.");
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Void... values) {}
}
public void whenPauseClicked(View view) {
Toast.makeText(getApplicationContext(), "All sounds were paused", Toast.LENGTH_SHORT).show();
PauseClicked = true;
soundPool.autoPause();
}
您需要使用AtomicBoolean,这是您的情况下使用的布尔值-当多个线程访问它时。尝试将PauseClicked的定义更改为
AtomicBoolean PauseClicked = new AtomicBoolean(false);
在您的代码中,尝试访问它时使用它的get和set方法。让我知道是否有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句