0

ストリーミング音楽プレーヤーを作成しようとしていますが、実装しようとしているSeekBarで少し問題が発生しています。現在、最初に再生された曲で正しく動作します。正しくシークでき、別のスレッドで更新されます。私が抱えている問題は、新しい曲が始まると、SeekBarが最後の曲の長さから現在の曲の進行状況までちらつくことです。どんな助けでもいただければ幸いです。

SeekBar宣言

    progress = (SeekBar) findViewById(R.id.seekBar1);
    progress.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            if(fromUser) {
                media.seekTo(progress);
            }
            else {                  
            }               
        }

        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

    });

別のスレッドでのSeekBarの更新

int current = 0;
    int total = media.getDuration();
    progress.setMax(total);
    progress.setIndeterminate(false);

    while(media!=null && current < total){
        try {
            Thread.sleep(1000); 
            current = media.getCurrentPosition();
            progress.setProgress(current);
        } catch (Exception e) {
            e.printStackTrace();
        }
    };
4

2 に答える 2

2

View別の から直接 を操作するべきではありませんThreadView.postまたはを代わりに使用runOnUiThreadして更新しViewます。

于 2012-07-30T16:55:50.247 に答える
0

進行状況の更新を開始するスレッドが終了しないように見える場合があります。つまり、曲が終了した後でも、1 秒に 1 回進行状況を更新し続けます。

current < totalここで犯人になる可能性が高いです。私が覚えていることから、現在の位置は合計の長さまでカウントされない (または少なくとも保証されていない) ため、ループが終了することはありません。代わりにOnCompletionListenerを追加しMediaPlayerて、曲が終了したときに確実に通知されるようにする必要があります。 .

于 2012-07-30T16:53:06.167 に答える