首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android互动-音乐

Android互动-音乐
EN

Stack Overflow用户
提问于 2013-10-08 18:48:28
回答 3查看 92关注 0票数 0

我正在为android设计一个应用程序,需要各种短的音乐文件后播放彼此。

我设置了一个"onClick“监听器来运行一个循环,一遍又一遍地播放这些声音文件,它们可能会播放100多次。

我需要用户能够在播放时与应用程序交互,这在此时是不能的,循环运行,基本上设备被冻结,直到音乐文件完成播放。

有什么有用的解决方案的建议吗?

循环基本上是:

代码语言:javascript
复制
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();
                }

            }

        }
    });
EN

回答 3

Stack Overflow用户

发布于 2013-10-08 19:04:38

您可以使用在后台播放音乐的服务来完成此操作。

这里有一个关于如何做到这一点的很好的教程:LINK

类似于this

当你想播放音乐的时候开始播放:

代码语言:javascript
复制
Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc); 

并在项目中创建一个新的服务文件:

代码语言:javascript
复制
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() {

}
}
票数 2
EN

Stack Overflow用户

发布于 2013-10-08 19:17:45

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

票数 1
EN

Stack Overflow用户

发布于 2013-10-09 18:58:27

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19245675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档