Mediabar进度更新seekbar不顺利?
我正在使用录音机和播放器开发应用程序。 我正在使用mediaplayer播放录制的.wav文件,同时我想更新为seekbar。 一切工作正常但我的问题是mediaplayer进度更新seekbar并没有顺利发生,如果我们playig一个小文件,seekbar的拇指在几秒或之间跳转。
任何人都可以帮助我解决问题,使其顺利寻求seekbar的进度。 我的代码如下所示。我totlay卡在这里。
mediaPlayerIntiate();
mediaPlayerSetSource();
mMediaPlayer.start();
task = new TimerTask() {
@Override
public void run() {
Graphbar.post(new Runnable() {
@Override
public void run() {
if (mMediaPlayer != null) {
if (playButtonState == MediaMode.PLAY) {
if (mMediaPlayer.isPlaying()) {
Graphbar.setProgress(mMediaPlayer
.getCurrentPosition());
mediaPlayerUpdateTimer(mMediaPlayer
.getCurrentPosition());
enableRewindandForward();
}
}
}
}
});
}
};
timer = new Timer();
timer.schedule(task, 0, 8);
mMediaPlayer.getCurrentPosition()以毫秒为单位返回当前时间,并将其更新为Seekbar,其最大容量为100.将一个公式与文件长度和100进行比较。尝试此功能
MediaPlayer mMediaPlayer = new MediaPlayer();
final SeekBar mSeelBar = new SeekBar(this);
final int duration = mMediaPlayer.getDuration();
final int amoungToupdate = duration / 100;
Timer mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!(amoungToupdate * mSeelBar.getProgress() >= duration)) {
int p = mSeelBar.getProgress();
p += 1;
mSeelBar.setProgress(p);
}
}
});
};
}, amoungToupdate);
当媒体播放器开始播放时,应该调用此过程。 内
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
**// call here**
});
更新
以秒为单位更新125次不是你应该做的事情。 请增加更新SeekBar的时间间隔。 我在阅读NullPointer的评论后添加了这个
player.prepare(); // or start()
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
service.scheduleWithFixedDelay(new Runnable()
{
@Override
public void run()
{
progressBar.setProgress(player.getCurrentPosition());
}
}, 1, 1, TimeUnit.MICROSECONDS);
这是我如何处理seekbar;
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
new SeekBarHandler().execute();
});
现在我有一个名为SeekBarHandler的Async Task来处理seekbar,像这样:
public class SeekBarHandler extends AsyncTask<Void, Void, Void> {
@Override
protected void onPostExecute(Void result) {
Log.d("##########Seek Bar Handler ################","###################Destroyed##################");
super.onPostExecute(result);
}
@Override
protected void onProgressUpdate(Void... values) {
seekBar.setProgress(mediaPlayer.getCurrentPosition());
super.onProgressUpdate(values);
}
@Override
protected Void doInBackground(Void... arg0) {
while(mediaPlayer.isPlaying()&&isViewOn==true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
onProgressUpdate();
}
return null;
}
}
现在在我的onPause中,我终止了AsyncTask,因为当用户无法看到搜索栏时,它保持线程正常运行
protected void onPause() {
isViewOn=false;
super.onPause();
}
在onResume上,我像这样开始AsyncTaskAgain
protected void onResume() {
isViewOn=true;
new SeekBarHandler().execute();
super.onResume();
}
正如你所看到的,我使用布尔标志isViewOn来检查视图是否打开或不处理seekbar。
链接地址: http://www.djcxy.com/p/88595.html