2011-03-03 38 views
1

我想创建一个音乐流应用程序。 到目前为止,它工作得很好。 我使用的TextView没有从按钮内点击点击

​​

方便的方法,以制备无限流(24×7的mp3流)。 它在这个调用上挂了几秒钟,我把它整齐地塞进我的startPlaying()方法中。 该按钮不会显示它被点击,直到流开始播放之后,用户才开始想知道他们是轻按了按钮还是错过了。 所以我想更新一个TextView标签旁边的按钮,说“等...”或“缓冲”等,然后在流开始后清除它,所以用户知道他们按下按钮确定。 即使我在调试中经过这一步,标签不会更新,直到onClick完成。我可以注释掉清除标签文本的最后一行,并可以看到它设置为“缓冲...”确定。但只有在它退出onClick后。这是使用媒体播放器create()方法的限制吗?

final Button startbutton = (Button) findViewById(R.id.Button01); 
this.tvBuffering = (TextView) findViewById(R.id.tvBuffering); 

startbutton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      tvBuffering.setText("Buffering..."); 
      //do something like invalidate() here?? 
      startPlaying(); //blocks here for a few seconds to buffer then plays. 
      tvBuffering.setText(" "); //clear the text since it's playing by now. 
     } 
    }); 

回答

1

这不是个好主意,故意包括那种在UI的延迟,因为任何事情的用户尝试对那些几秒钟这样做只会阻塞。我假设你的startPlaying()包括致电prepare(),以及start()。当从不可立即使用的数据源(例如数据流)获取数据时,应该使用prepareAsync(),这将开始准备并立即返回,而不是阻止,直到准备完成。

您可以将回调到您MediaPlayer到再采取行动,一旦准备已经经历了MediaPlayer.OnPreparedListener

完成下面是一个简单的例子。请注意,您的OnClickListener可以保持不变,只要您将startPlaying()方法中的prepare()更改为prepareAsync(),并从startPlaying()中删除start()呼叫。

startbutton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     tvBuffering.setText("Buffering..."); 

     startPlaying(); //which should call prepareAsync() instead of prepare() 
         //and have no call to start() 
    } 
}); 

mYourMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     start(); 
     tvBuffering.setText(" "); 
    } 
}); 
+0

太棒了!太感谢了! –