自定义小部件setVisibilty方法不起作用?

时间:2018-09-24 05:50:34

标签: android android-layout android-widget android-mediaplayer

我制作了一个自定义小部件,可以播放url中的音频。我使用MediaPlayer API。

窗口小部件的实现方式:

    public class CustomAudioPayer extends RelativeLayout {

        ....
        public CustomAudioPayer(final Context context, @Nullable AttributeSet attrs) {
                super(context, attrs);
                LayoutInflater inflater = LayoutInflater.from(context);
                View mainView = inflater.inflate(R.layout.custom_palyer, this, true);

        // Code to initialize player & set url
        .......
        // On button click, we start playing

        play_button.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        showProgressBar(true);
         mediaPlayer = new MediaPlayer();
                if (headers != null) {
                    Uri uri = Uri.parse(url);
                    mediaPlayer.setDataSource(getContext(), uri, headers);
.....

        mediaPlayer.prepare();

.....
        }
        }
        }
    ...........
    }

但是,当媒体播放器缓冲来自服务器的流时,我使一个进度条可见,基于播放器状态和缓冲区侦听器,进度条可见和不可见。

mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mediaPlayer, int what) {
                Log.e(TAG, "onBufferingUpdate");
                switch (what) {
                    case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                        showProgressBar(true);
                        break;
                    case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                        showProgressBar(false);
                        break;
                }
            }
        });

但是初始进度条可见并不能在小部件中尽快反映出来。即,当媒体播放器当时正在从服务器查询内容时,进度条上的setVisibility方法均无效。

showProgressBar(boolean)方法:

private void showProgressBar(boolean show) {
        if (show) {
            buffering_pb.setVisibility(VISIBLE);
            Log.e(TAG, "buffering_pb: Visible");
        } else {
            buffering_pb.setVisibility(INVISIBLE);
            Log.e(TAG, "buffering_pb: Invisible");
        }
    }

在上述方法中添加的日志会尽快打印在logcat上,它们变为可见或不可见,但UI不会显示相应的可见性更改,这可能是什么问题?

更新

用户pskinkMediaPlayer.prepareAsync()而不是MediaPlayer.prepare();的注释建议文档中,我将方法从prepare()更改为prepareAsyc(),然后我的视图反映了可见的并立即进入隐形状态。

0 个答案:

没有答案