2016-09-27 3 views
0

Das ist mein Code, ich bin mir fast sicher, dass das Problem mit der While-Schleife ist.Fortschrittsbalken für Musik-Player funktioniert nicht und stürzt ab

 public void start(View view) { 

     int currentPosition = 0; 


     player = MediaPlayer.create(this, R.raw.sound); 

     player.start(); 

     int total = player.getDuration(); 
     progressBar.setProgress(0); 
     progressBar.setMax(player.getDuration()); 

     while (player != null && currentPosition < total) { 
//   try { 
//    Thread.sleep(500); 

       currentPosition = player.getCurrentPosition(); 

//   } catch (InterruptedException e) { 
//    return; 
//   } catch (Exception e) { 
//    return; 
//   } 

      progressBar.setProgress(currentPosition); 
     } 
    } 


    public void stop(View view) { 

     player.stop(); 

    } 

ob ich die schlafintervalle habe, ist mein ergebnis dasselbe; Der Sound beginnt zu spielen, aber ich kann es nicht stoppen, und der Fortschrittsbalken bewegt sich nicht. ich würde etwas Hilfe zu schätzen

+0

Was bedeutet 'getCurrentPosition()' tun? Gibt es tatsächlich einen Wert zurück? Was meinst du, der Fortschrittsbalken bewegt sich nicht? Gibt es eine Benutzeroberfläche? – lux

Antwort

0

Ich habe diesen Code in meiner App für die Verwendung von seekBar mit MediaPlayer. Es implementiert Runnable, um die seekBar zu aktualisieren, während die Musik abgespielt wird. Werfen Sie einen Blick auf den Code:

public class MainActivity extends Activity implements Runnable, 
    OnClickListener, OnSeekBarChangeListener { 
private SeekBar seekBar; 
private Button startMedia; 
private Button stopMedia; 
private MediaPlayer mp; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    seekBar = (SeekBar) findViewById(R.id.seekBar1); 
    startMedia = (Button) findViewById(R.id.button1); 
    stopMedia = (Button) findViewById(R.id.button2); 
    startMedia.setOnClickListener(this); 
    stopMedia.setOnClickListener(this); 
    seekBar.setOnSeekBarChangeListener(this); 
    seekBar.setEnabled(false); 
} 

public void run() { 
    int currentPosition = mp.getCurrentPosition(); 
    int total = mp.getDuration(); 

    while (mp != null && currentPosition < total) { 
    try { 
    Thread.sleep(1000); 
    currentPosition = mp.getCurrentPosition(); 
    } catch (InterruptedException e) { 
    return; 
    } catch (Exception e) { 
    return; 
    } 
    seekBar.setProgress(currentPosition); 
    } 
} 

public void onClick(View v) { 
    if (v.equals(startMedia)) { 
    if (mp == null) { 
    mp = MediaPlayer.create(getApplicationContext(), R.raw.song2); 
    seekBar.setEnabled(true); 
    } 
    if (mp.isPlaying()) { 
    mp.pause(); 
    startMedia.setText("play"); 
    } else { 
    mp.start(); 
    startMedia.setText("pause"); 
    seekBar.setMax(mp.getDuration()); 
    new Thread(this).start(); 
    } 
    } 

    if (v.equals(stopMedia) && mp != null) { 
    if (mp.isPlaying() || mp.getDuration() > 0) { 
    mp.stop(); 
    mp = null; 
    startMedia.setText("play"); 
    seekBar.setProgress(0); 
    } 
    } 

} 

public void onProgressChanged(SeekBar seekBar, int progress, 
    boolean fromUser) { 
    try { 
    if (mp.isPlaying() || mp != null) { 
    if (fromUser) 
    mp.seekTo(progress); 
    } else if (mp == null) { 
    Toast.makeText(getApplicationContext(), "Media is not running", 
     Toast.LENGTH_SHORT).show(); 
    seekBar.setProgress(0); 
    } 
    } catch (Exception e) { 
    Log.e("seek bar", "" + e); 
    seekBar.setEnabled(false); 

    } 
} 

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

} 

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

} 
} 

Dank: Sridhar Kulkarni

+0

Ich habe versucht, mit Ihrer Lösung, aber es hat nicht funktioniert –

+0

eigentlich ich habe es mit Ihrem Code arbeiten! aber ich verstehe immer noch nicht, warum ich es runnable machen muss –

+0

William Morrison erklärt, ein Runnable trennt Code, der asynchron ausgeführt werden muss, aus, wie der Code ausgeführt wird. Dies hält Ihren Code flexibel. Zum Beispiel kann asynchroner Code in einer ausführbaren Datei auf einem Threadpool oder einem dedizierten Thread ausgeführt werden. Hier funktioniert die Verwendung der while-Schleife nicht, da wir den Thread für 1000 ms oder eine beliebige Dauer schlafen lassen müssen. Wenn Sie den Fortschritt der Suchleiste jede Sekunde aktualisieren, müssen wir den Hauptthread nicht schlafen –