活动恢复时Android Mediaplayer会出现多个实例
我正在开发一个应用程序,使用内置的Android Mediaplayer播放流。除了当我按下“主页”按钮,然后再次打开活动时,应用程序只是启动了一个新的mediaplayer实例,我可以听到两次流,而不可能停止第一次流 情景 我的应用程序只包含一个活动活动恢复时Android Mediaplayer会出现多个实例,android,streaming,android-mediaplayer,Android,Streaming,Android Mediaplayer,我正在开发一个应用程序,使用内置的Android Mediaplayer播放流。除了当我按下“主页”按钮,然后再次打开活动时,应用程序只是启动了一个新的mediaplayer实例,我可以听到两次流,而不可能停止第一次流 情景 我的应用程序只包含一个活动 我第一次打开我的应用程序,流就开始了 按下home(主页)按钮,活动“最小化”,但音乐仍在播放 我再次打开我的应用程序,它只是启动了一个新的mediaplayer实例,两次播放相同的音乐 如果mediaplayer为空或正在播放,我会检查onRe
public class MainActivity {
private MediaPlayer _mp;
private PlayTask _playTask;
private PauseTask _pauseTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume(){
super.onResume();
if(_mp != null && _mp.isPlaying()){
// I should find a playing mediaplayer here but it's always null!!!
Toast.makeText(MainActivity.this, "Playing mediaplayer found!", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(MainActivity.this, "No mediaplayer found :(", Toast.LENGTH_SHORT).show();
}
}
/* ...:::============= *** ASYNCTASK Definition START *** =============:::... */
private class PlayTask extends AsyncTask<Void, Void, Integer> {
@Override
protected void onPreExecute() {
if(_mp == null)
_mp = new MediaPlayer();
else if(_mp.isPlaying()){
_mp.stop();
_mp.release();
_mp = null;
_mp = new MediaPlayer();
}
}
@Override
protected Integer doInBackground(Void...voids) {
try{
_mp.setDataSource(URL_DATASOURCE);
_mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
_mp.prepare();
_mp.start();
}
catch(Exception ex){
}
return 0;
}
@Override
protected void onPostExecute(Integer i) {
}
}
private class PauseTask extends AsyncTask<Void, Void, Integer> {
@Override
protected void onPreExecute() {
// Do Nothing here...for now
}
@Override
protected Integer doInBackground(Void...voids) {
_mp.stop();
_mp.release();
_mp = null;
return 0;
}
@Override
protected void onPostExecute(Integer i) {
}
}
public void playPause(View view){
if(_play){
_playTask = new PlayTask();
_playTask.execute();
}
else{
_pauseTask = new PauseTask();
_pauseTask.execute();
}
}
公共类活动{
私人媒体播放器;
私人游戏任务(PlayTask);;
私人Pausetasku PauseTask;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@凌驾
受保护的void onResume(){
super.onResume();
如果(\u-mp!=null&&u-mp.isPlaying()){
//我应该在这里找到一个正在播放的mediaplayer,但它总是空的!!!
Toast.makeText(MainActivity.this,“正在播放的mediaplayer已找到!”,Toast.LENGTH_SHORT.show();
}
否则{
Toast.makeText(MainActivity.this,“未找到mediaplayer:(”,Toast.LENGTH_SHORT.show();
}
}
/*…::================***异步任务定义开始***====================================================================================================***异步任务定义开始****/
私有类PlayTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
如果(_mp==null)
_mp=新媒体播放器();
否则如果(\mp.isPlaying()){
_mp.stop();
_mp.release();
_mp=null;
_mp=新媒体播放器();
}
}
@凌驾
受保护的整数doInBackground(Void…voids){
试一试{
_mp.setDataSource(URL\u数据源);
_mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
_mp.prepare();
_mp.start();
}
捕获(例外情况除外){
}
返回0;
}
@凌驾
受保护的void onPostExecute(整数i){
}
}
私有类PauseTask扩展异步任务{
@凌驾
受保护的void onPreExecute(){
//现在什么都不要做
}
@凌驾
受保护的整数doInBackground(Void…voids){
_mp.stop();
_mp.release();
_mp=null;
返回0;
}
@凌驾
受保护的void onPostExecute(整数i){
}
}
公共无效播放暂停(视图){
如果(_play){
_playTask=新的playTask();
_playTask.execute();
}
否则{
_pauseTask=新的pauseTask();
_pauseTask.execute();
}
}
}
有什么想法吗?谢谢你需要分享你的代码。看我的代码。我有一个按钮可以触发
播放暂停
方法。当我播放时,我会创建一个新的mp实例。当我回家并再次打开活动时,我应该能够在onResume
中获得相同的mp实例,但由于某些原因,它总是空的。请保留该对象nto单例类。活动不是地方。更好的是从服务运行媒体播放器。