0

我正在为 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();
                }

            }

        }
    });
4

3 回答 3

2

您可以使用服务在后台播放音乐来做到这一点。

这是一个关于如何做到这一点的很棒的教程:链接

这样的东西:

当你想播放音乐时开始这个:

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() {

}
}
于 2013-10-08T11:04:37.617 回答
1

首先,睡眠不是控制时间的方法,因为 MediaPlayer 有一个可以设置的 onCompletionListener。如果您注意资源使用,它还有一个 setNextMediaPlayer 方法(您不能只创建一堆 MediaPlayer 并准备好它们)。

其次,您需要一个单独的 Thread 或 AsyncTask(这将产生一个新的 Thread)。除非您另行指定,否则服务将在与 UI 相同的线程中运行,并且它通常只会增加不必要的复杂层。

最后,您可能想考虑使用 SoundPool。

于 2013-10-09T10:58:26.683 回答
1

我只能猜测,因为您没有将代码附加到您的问题中,但听起来您实现了一个在 UI 线程(应用程序的主线程)上运行的循环。应用程序似乎被冻结了,因为一个线程一次只能执行一行代码,并且不能并行运行代码。您要做的是创建一个不同的线程,在该线程上执行播放音乐的循环。有不同的方法可以实现这一目标。我想你应该尝试实现一个服务。服务使您可以在不同的线程上运行代码,并且您可以轻松地与服务通信,例如开始或停止播放音乐。有关服务的更多信息,请查看:http: //developer.android.com/reference/android/app/Service.html 你也可以google一下android服务教程,网上有很多。祝你好运!

于 2013-10-08T11:17:44.650 回答