TextView没有从按钮onClick中绘制

时间:2011-03-03 09:04:05

标签: android audio onclick media-player buffering

我正在尝试制作音乐流媒体应用。 到目前为止,它的工作正常。 我正在使用

MediaPlayer.create(thisContext, Uri.parse(PATH_TO_STREAM));

准备无限流的便捷方法(24x7 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 个答案:

答案 0 :(得分:1)

故意在UI中包含这种延迟并不是一个好主意,因为这会阻止用户在几秒钟内尝试做的任何事情。我假设您的startPlaying()包含对prepare()的调用,以及start()。从无法立即获得的源(例如流)中获取数据时,您应该使用prepareAsync()代替,这将开始准备并立即返回而不是阻止,直到准备工作完成。

您可以将回调附加到MediaPlayer,然后在准备完成后通过MediaPlayer.OnPreparedListener

采取行动

这是一个简单的例子。请注意,只要您将prepare()方法中的startPlaying()更改为prepareAsync()并从start()移除startPlaying()来电,您的OnClickListener就可以保持不变。

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(" ");
    }
});