Android:SeekBar未使用4.1.2设备上的处理程序进行更新
朋友们,我正在开发一个应用程序,它可以播放小型mp3音轨(播客)。现在,我下面展示的代码在安卓3.2上正常工作。但是在Android 4.1.2上,SeekBar没有被处理程序实例更新。我已经读到SeekBar中的一个错误导致了这个问题,但是它应该在安卓3.2之后被修复。任何帮助或建议都将不胜感激。这是我的密码:Android:SeekBar未使用4.1.2设备上的处理程序进行更新,android,media-player,handler,progress,seekbar,Android,Media Player,Handler,Progress,Seekbar,朋友们,我正在开发一个应用程序,它可以播放小型mp3音轨(播客)。现在,我下面展示的代码在安卓3.2上正常工作。但是在Android 4.1.2上,SeekBar没有被处理程序实例更新。我已经读到SeekBar中的一个错误导致了这个问题,但是它应该在安卓3.2之后被修复。任何帮助或建议都将不胜感激。这是我的密码: public class PodcastDetailFragment extends BaseFragment { private MediaPlayer mediaPlaye
public class PodcastDetailFragment extends BaseFragment {
private MediaPlayer mediaPlayer = null;
private Button playPauseButton = null;
private SeekBar seekBar = null;
private TextView timeView = null;
private int totalDuration = 0;
private Bundle data;
private Handler handler=new Handler();
private Runnable runnable = new Runnable() {
public void run() {
int progress = mediaPlayer.getCurrentPosition();
seekBar.setProgress(progress);
int hours = ((progress/1000)/60)/60;
int minutes = ((progress/1000)/60)%60;
int seconds = ((progress/1000)%60)%60;
String hoursString = (hours<10)?"0":"";
String minutesString = (minutes<10)?"0":"";
String secondsString = (seconds<10)?"0":"";
timeView.setText(hoursString+hours+":"+minutesString+minutes+":"+secondsString+seconds);
handler.postDelayed(this, 100);
}
};
public static PodcastDetailFragment newInstance(Bundle bundle) {
PodcastDetailFragment f = new PodcastDetailFragment();
f.setArguments(bundle);
return f;
}
/**
* When creating, retrieve this instance's number from its arguments.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
data = getArguments();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
getView().findViewById(R.id.preparing_track_progress_bar).setVisibility(View.VISIBLE);
super.onActivityCreated(savedInstanceState);
}
@Override
public void onPause() {
super.onPause();
if (mediaPlayer != null) {
LogUtils.d("Podcast MediaPlayer", "stop() inside the onPause() was called");
mediaPlayer.stop();
}
}
@Override
public void onDestroy() {
LogUtils.d("Podcast MediaPlayer", "release() was called");
mediaPlayer.release();
super.onDestroy();
}
/**
* The Fragment's UI is just a simple text view showing its instance number.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.podcasts_details, container, false);
TextView dv = (TextView) v.findViewById(R.id.durationView);
dv.setText(data.getString("duration"));
timeView = (TextView) v.findViewById(R.id.timeView);
timeView.setText("00:00:00");
playPauseButton = (Button) v.findViewById(R.id.playPauseButtonView);
playPauseButton.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
playPauseButton.setText(getResources().getString(
R.string.play));
} else {
mediaPlayer.start();
playPauseButton.setText(getResources().getString(
R.string.pause));
}
}
});
seekBar = (SeekBar) v.findViewById(R.id.seekBarView);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekBar) {
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
});
mediaPlayer =new MediaPlayer();
mediaPlayer
.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
totalDuration = mp.getDuration();
seekBar.setMax(totalDuration);
playPauseButton.setEnabled(true);
try{
getView().findViewById(R.id.preparing_track_progress_bar).setVisibility(View.INVISIBLE);
}catch(Exception ex){
ex.printStackTrace();
}
handler.postDelayed(runnable, 100);
}
});
mediaPlayer.setDataSource(Uri.parse(data.getString("podcast_url")).toString());
playPauseButton.setEnabled(false);
mediaPlayer.prepareAsync();
return v;
}
}
public类PodcastDetailFragment扩展了BaseFragment{
私有媒体播放器MediaPlayer=null;
专用按钮playPauseButton=null;
私有SeekBar SeekBar=null;
私有TextView timeView=null;
私有整数totalDuration=0;
私有包数据;
私有处理程序=新处理程序();
private Runnable Runnable=new Runnable(){
公开募捐{
int progress=mediaPlayer.getCurrentPosition();
seekBar.setProgress(进度);
整小时=((进度/1000)/60)/60;
整数分钟=((进度/1000)/60)%60;
整数秒=((进度/1000)%60)%60;
String hoursString=(hours您应该使用AsyncTask或服务(以防音乐在后台播放)而不是带有处理程序的工作线程。AsyncTask的onProgressUpdate方法非常有用,您可以使用它根据音频文件的进度更新条形图
下面是AsyncTask的一个基本示例,以及您应该如何使用它:
private class TestAsyncTask extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... arg0) {
for(int i=0; i<songDuration; i++){
doSomething();
publishProgress(i);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
//UPDATE BAR
}
@Override
protected void onPostExecute(Void result) {
//DO SOMETHING WHEN FINISHED PLAYING
}
}
私有类TestAsyncTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…arg0){
对于(int i=0;i我已经解决了这个问题。SeekBar还可以。只是当你下载整个曲目时才给出曲目的长度。所以要正确显示SeekBar上的进度,你需要知道曲目的长度。因此,你需要获取曲目的长度,然后调用SeekBar.setMax(lenghtOfTrack)并通过方法setProgress(progress)按应更新进度.我想每100毫秒更新一次seekBar,显示曲目播放的时间,那么您希望如何使用一次使用的AsyncTask来实现它?AsyncTask可以使用多长时间。您需要每100毫秒发布一次进度。AsyncTask仅使用一次与此无关。正如您所看到的处理程序的方法根本不是false。