¿Por qué mi SeekBar no se actualiza?
Frecuentes
Visto 89 equipos
1
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) {
}
2 Respuestas
1
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
0
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 android seekbar android-seekbar or haz tu propia pregunta.
He puesto mRunnable.run() después de la definición de Runnable y funciona. Muchas gracias. - Lukaš Anda