2012-02-06 51 views
1

我有一个服务类运行我的mediaplayer它工作正常,我唯一的问题是,当我的服务创建mediaplayer它有点暂停我的用户界面,像它的挂起或东西,直到我的mediaplayer完成创建它自己。我想要发生的是,当我按下播放按钮时,出现一个吐司消息并显示“正在连接”,当mediaplayer准备显示吐司消息说“已连接”时,mediaplayer开始播放音乐,不知何故,我的吐司不显示,如果他们就其后期..mediaplayer和服务类

继承人我的服务代码:

public class myservice extends Service { 

MediaPlayer player; 
private Handler UIHandler = new Handler(); 
private Uri source = Uri.parse("http://www.mydomain.com:8000/listen.mp3"); 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

public void onCreate() { 
    Toast.makeText(this, "Connecting", Toast.LENGTH_SHORT).show(); 
      player = MediaPlayer.create(this, source); 
} 

private void testtoast() { 
    Toast.makeText(this, "Connecting", Toast.LENGTH_SHORT).show(); 
} 

public void onStart(Intent intent, int StartId) { 
    Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); 
    player.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer player) { 
      // TODO Auto-generated method stub 
      player.start(); 
     } 
    }); 
} 

public void onDestroy() { 
    Toast.makeText(this, "Destroyed", Toast.LENGTH_SHORT).show(); 
    player.stop(); 
    player.release(); 
} 
    } 
+0

我个人从未使用过'MediaPlayer'类,所以我不知道使用它的任何方法,或者当'.create()'时它的行为如何。然而,我认为值得指出的是'Service'在UI线程内运行,*不在其自己的线程或进程内运行。这意味着您在'Service'中执行的任何耗时的工作,例如'onCreate()',都会影响UI的响应性,如果不小心的话,甚至会导致ANR。因此,您在“服务”中执行的任何耗时或过程密集型工作仍应在单独的“线程”上完成。 – Trevor 2012-02-06 18:03:20

+0

感谢指出,特雷弗你有一个样本,我怎么能做到这一点..我是一个noob在Android真的 – HeartlessArchangel 2012-02-06 23:43:40

回答

0

更换

 player = MediaPlayer.create(this, source); 

 player = new MediaPlayer(); 
     player.setDataSource(source); 
     player.prepareAsync(); 

MediaPlayer.create调用prepare()准备MediaPlayer的方法是一个同步操作并挂起UI,因此您将在UI中遇到延迟。所以你应该明确地使用.prepareAsync()来避免这个延迟,如上面的例子所提供的。