0

我在同一个活动上有一个 VideoView 和一个 TextView。这是布局的 xml。

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rellayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <VideoView
        android:id="@+id/videoview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:padding="5dp" />
    <TextView 
        android:id="@+id/numberTicker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/purple"
        android:textStyle="bold"
        android:gravity="top|right"
        android:textSize="35dp"
        android:maxEms="3"/>
</RelativeLayout>

一旦视频开始播放,我希望在 numberTicker 文本视图上显示一个数字。请注意,这些数字可能每秒更改 4 次。无论如何,我遇到的主要问题是确定视频已经开始播放并继续更新 TextView。

我的尝试:

vid = (VideoView) findViewById(R.id.videoview);
ratings = (TextView) findViewById(R.id.ratingTicker);
vid.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                vid.start();
                vid.postDelayed(onEveryQuarterSecond,250);
            }
        });
...
...
    private Runnable onEveryQuarterSecond = new Runnable() {

        Random r = new Random();
        int uVal, aVal;

        @Override
        public void run() {
            ratings.setText(Integer.toString(r.nextInt()));

        }
    };

Runnable 代码只会运行一次,并且永远不会更新。我错过了什么吗?

谢谢您的帮助!

4

2 回答 2

1

你得到一个MediaPlayer对象onPrepared()。你可以像这样使用它:

vid.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
            this.mediaPlayer = mp; //have mediaPlayer be a class variable
            vid.start();
            vid.postDelayed(onEveryQuarterSecond,250);
        }
    });

 private Runnable onEveryQuarterSecond = new Runnable() {

    Random r = new Random();
    int uVal, aVal;

    @Override
    public void run() {
        while(mediaPlayer.isPlaying()) {
             ratings.setText(Integer.toString(r.nextInt()));
             Thread.sleep(250);
        }
    }
};
于 2012-08-01T08:34:24.513 回答
0

考虑使用新线程来不阻塞主 UI 线程:

public void updateEverySecond() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (mediaPlayer.isPlaying()) {
                try {
                ratings.setText(Integer.toString(r.nextInt()));
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }
    }).start();
}
于 2015-07-20T10:14:03.540 回答