¿Por qué mi SeekBar no se actualiza?

Implementé una barra de búsqueda en mi aplicación que es un simple reproductor de música. Pero cuando reproduzco la música (recibida de uri) simplemente no se actualiza al ejecutarse. Pero cuando lo muevo a alguna posición, mueve la canción allí. ¿Alguna idea de cómo resolver este problema?

Mi código:

public class MusicPlayer extends ThemableActivity implements SeekBar.OnSeekBarChangeListener {
MediaPlayer musicPlayer;

@Override
protected void onCreate(Bundle SavedInstanceState) {
    super.onCreate(SavedInstanceState);
    setContentView(R.layout.media_player_layout);
    Intent intent = getIntent();
    String track = intent.getDataString();
    TextView txt = (TextView)findViewById(R.id.txt);
    txt.setGravity(Gravity.CENTER);
    txt.setText(track);
    ImageView img = (ImageView)findViewById(R.id.img);
    img.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    final Uri uri = getIntent() != null ? getIntent().getData() : null;
    final SharedPreferences premiumSettings = getSharedPreferences("PREMIUM", Context.MODE_PRIVATE);
    final boolean isPremium = premiumSettings.getBoolean("isPremium", false);
    final SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);
    seekBar.setOnSeekBarChangeListener(this);


    if (isPremium) {
        musicPlayer = MediaPlayer.create(MusicPlayer.this, uri);
        seekBar.setMax(musicPlayer.getDuration()/1000);
        musicPlayer.start();
        final ImageButton play = (ImageButton) findViewById(R.id.play);
        if(!musicPlayer.isPlaying()){

            play.setImageResource(android.R.drawable.ic_media_play);
        }
        else{
            play.setImageResource(android.R.drawable.ic_media_pause);

        }
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = musicPlayer.getCurrentPosition();
                if(musicPlayer.isPlaying()){
                    musicPlayer.pause();
                    play.setImageResource(android.R.drawable.ic_media_play);

                }
                else {
                    musicPlayer.seekTo(position);
                    musicPlayer.start();
                    play.setImageResource(android.R.drawable.ic_media_pause);

            }}
        });
        final Handler mHandler = new Handler();
        Runnable mRunnable = new Runnable() {

            @Override
            public void run() {
                if(musicPlayer!=null){
                    int mCurrentPosition = musicPlayer.getCurrentPosition() / 1000;
                    seekBar.setProgress(mCurrentPosition);
                }
                mHandler.postDelayed(this, 1000);
            }
        };

        ImageButton exit = (ImageButton) findViewById(R.id.exit);
        exit.setImageResource(android.R.drawable.btn_dialog);
        exit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (musicPlayer.isPlaying()) {
                    musicPlayer.stop();
                }
                    musicPlayer.release();
                    musicPlayer = null;
                    finish();

            }
        });


    }
    else {
        AlertDialog.Builder builder = new AlertDialog.Builder(MusicPlayer.this);
        builder.setTitle("Error");
        builder.setMessage("You are not premium user. Please enter the promocode or buy the full version");
        builder.setIcon(R.drawable.holo_dark_action_info);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                finish();
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
    }}
public void onBackPressed () {
        if(musicPlayer.isPlaying()) {
            musicPlayer.stop();
        }
            musicPlayer = null;
        finish();
}

@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
    if (musicPlayer != null && b){
        musicPlayer.seekTo(i * 1000);
    }

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

preguntado Oct 07 '14, 14:10

2 Respuestas

El ejecutable nunca se ejecuta, en el fragmento que publicaste. Yo hubiera esperado cualquiera mHandler.post(mRunnable); or mRunnable.run();, fuera del mismo Runnable

Respondido 07 Oct 14, 14:10

He puesto mRunnable.run() después de la definición de Runnable y funciona. Muchas gracias. - Lukaš Anda

cree un hilo simple, diga "progressSeekBarOnEverySecond"

progressSeekBarOnEverySecond=new Runnable() {

        @Override
        public void run() {

            if(seekBar != null) 
            {
                seekBar.setProgress(musicPlayer.getCurrentPosition());
                textviewCurrentVideoTime.setText((musicPlayer.getCurrentPosition()/1000)/60 +":"+(musicPlayer.getCurrentPosition()/1000)%60);   
            }

            if(musicPlayer.isPlaying()) 
            {
                seekBar.postDelayed(onEverySecond, 1000);
            }

        }
    };

y ejecuta el hilo... en el momento en que hagas clic en reproducir... o cualquier lógica que quieras usar

textviewCurrentVideoTime es la vista de texto ... en la que estoy mostrando la hora actual del video ... también tenga en cuenta que una vez que se llama al hilo ... se llamará automáticamente en 1 segundo y la barra de búsqueda avanzará a la posición actual del video

Respondido 07 Oct 14, 14:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.