Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每1秒更新seekbar时,音乐播放不顺畅_Java_Android_Android Studio_Timer - Fatal编程技术网

Java 每1秒更新seekbar时,音乐播放不顺畅

Java 每1秒更新seekbar时,音乐播放不顺畅,java,android,android-studio,timer,Java,Android,Android Studio,Timer,添加计时器后,方法seekbar应该每秒更新一次,它正在得到更新,但它们只是一个小暂停,就像更新seekbar需要一段时间来更新。。。这导致seekbar运行不平稳,给人一种滞后的感觉 package com.example.musicplayer; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.media.AudioManager; import

添加计时器后,方法seekbar应该每秒更新一次,它正在得到更新,但它们只是一个小暂停,就像更新seekbar需要一段时间来更新。。。这导致seekbar运行不平稳,给人一种滞后的感觉

package com.example.musicplayer;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.SeekBar;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {
    MediaPlayer mediaPlayer;
    AudioManager audioManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mediaPlayer = MediaPlayer.create(this,R.raw.senorita);
        audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        int myMaxValume= audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        int myCurrentValume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

        SeekBar valumeRocker = findViewById(R.id.seekBar);
        valumeRocker.setMax(myMaxValume);
        valumeRocker.setProgress(myCurrentValume);

        valumeRocker.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        //timeline part of music app
        final SeekBar timeline = findViewById(R.id.timeline);

        timeline.setMax(mediaPlayer.getDuration());

        //set onChange listner on timeline
        timeline.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                mediaPlayer.seekTo(progress);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        //customise timeline seekbar

        new Timer().scheduleAtFixedRate(new TimerTask() {
                                            @Override
                                            public void run() {
                                                timeline.setProgress(mediaPlayer.getCurrentPosition());
                                            }
                                        }
                , 0, 1000);
    }
    public void playMe(View view){
        mediaPlayer.start();
    }
    public void pauseMe(View view){
        mediaPlayer.pause();
    }
}
如果我删除计时器方法。。这一切都很好。。。我想我在这方面做了些什么

帮帮我


提前感谢您。

您需要检查seekbar上的'fromUser'变量是否为真。因为在这两种情况下,当用户手动更改和计时器更新seekbar时,您都会得到seekbar change回调

更新代码:-

package com.example.musicplayer;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.SeekBar;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {
MediaPlayer mediaPlayer;
AudioManager audioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mediaPlayer = MediaPlayer.create(this,R.raw.senorita);
    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int myMaxValume= audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    int myCurrentValume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

    SeekBar valumeRocker = findViewById(R.id.seekBar);
    valumeRocker.setMax(myMaxValume);
    valumeRocker.setProgress(myCurrentValume);

    valumeRocker.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
    //timeline part of music app
    final SeekBar timeline = findViewById(R.id.timeline);

    timeline.setMax(mediaPlayer.getDuration());

    //set onChange listner on timeline
    timeline.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser) mediaPlayer.seekTo(progress);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
    //customise timeline seekbar

    new Timer().scheduleAtFixedRate(new TimerTask() {
                                        @Override
                                        public void run() {
                                            timeline.setProgress(mediaPlayer.getCurrentPosition());
                                        }
                                    }
            , 0, 1000);
}
public void playMe(View view){
    mediaPlayer.start();
}
public void pauseMe(View view){
    mediaPlayer.pause();
}
}