Android:SeekBar未使用4.1.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

朋友们,我正在开发一个应用程序,它可以播放小型mp3音轨(播客)。现在,我下面展示的代码在安卓3.2上正常工作。但是在Android 4.1.2上,SeekBar没有被处理程序实例更新。我已经读到SeekBar中的一个错误导致了这个问题,但是它应该在安卓3.2之后被修复。任何帮助或建议都将不胜感激。这是我的密码:

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。