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テキストビューに番号を表示したいと思います。数字は1秒間に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 に答える