Android互动 - 音乐

时间:2013-10-08 10:48:28

标签: java android

我正在设计一款适用于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();
                }

            }

        }
    });

3 个答案:

答案 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。