我正在设计一款适用于Android的应用程序,需要各种简短的音乐文件才能互相播放。
我已经设置了一个“onClick”监听器来运行一个循环播放每个声音文件,它们可能会播放超过100次。
但是
我需要用户能够在播放时与应用进行交互,此时无法及时播放循环,基本上设备会被冻结,直到音乐文件播放完毕。
指向有用解决方案的任何指示?
循环基本上是:
mPlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public synchronized void onClick(View v) {
for(char i: method.toCharArray()){
mPlayer.play(getActivity(),Integer.parseInt(Character.toString(i)));
try {
wait(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
答案 0 :(得分:2)
您可以使用服务在后台播放音乐。
以下是有关如何执行此操作的精彩教程:LINK。
像this:
当你想播放音乐时启动它:
Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc);
在项目中创建一个新的服务文件:
public class BackgroundSoundService extends Service {
private static final String TAG = null;
MediaPlayer player;
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.idil);
player.setLooping(true); // Set looping
player.setVolume(100,100);
}
public int onStartCommand(Intent intent, int flags, int startId) {
player.start();
return 1;
}
public void onStart(Intent intent, int startId) {
// TO DO
}
public IBinder onUnBind(Intent arg0) {
// TO DO Auto-generated method
return null;
}
public void onStop() {
}
public void onPause() {
}
@Override
public void onDestroy() {
player.stop();
player.release();
}
@Override
public void onLowMemory() {
}
}
答案 1 :(得分:1)
我只能猜测,因为你没有为你的问题附加代码,但听起来你实现了一个在UI线程上运行的循环,这是你的应用程序的主线程。应用程序似乎被冻结,因为一个线程一次只能执行一行代码而不能并行运行代码。你要做的是创建一个不同的线程,在该线程上执行播放音乐的循环。有不同的方法来实现这一目标。我想你应该尝试实现一项服务。服务使您可以在不同的线程上运行代码,并且您可以轻松地与服务进行通信,例如,用于开始或停止播放音乐。有关服务的更多信息,请查看:http://developer.android.com/reference/android/app/Service.html 你也可以google for android服务教程,网上有很多。祝你好运!
答案 2 :(得分:1)
首先,睡眠不是控制时间的方法,因为MediaPlayer有一个你可以设置的onCompletionListener。如果你小心使用资源,它也有一个setNextMediaPlayer方法(你不能只创建一堆MediaPlayers并准备它们)。
其次,您需要一个单独的Thread或AsyncTask(它将生成一个新的Thread)。除非您另行指定,否则服务将在与UI相同的线程中运行,并且它通常只会添加不必要的复杂层。
最后,您可能希望了解如何使用SoundPool。