2016-10-13 6 views
0

자바를 배우기 시작했으며 현재 일부 미디어 기본 사항을 배우고 있습니다. 음량 조절기 탐색 막대가 잘 작동하는 작은 응용 프로그램 (음악 파일을 재생 함)을 만들었습니다. 재생 및 정지 버튼도 제대로 작동합니다. 음악이 재생 될 때까지 그 지점까지 도달 할 수 있었고, 진행 상황은 바 업데이트를 찾으며 노래가 재생 될 때 필요한대로 오른쪽으로 이동합니다. 음악의 진행 상황을 실제로 변경할 수있는 코드를 추가하려는 경우 검색이 업데이트 될 때마다 (1000 밀리 초/1 초마다) 일시 중지 (지연)가 발생합니다.Android 오디오 검색 바 지연

mplayer.seekTo(progress); 

을 코드에 추가하면 검색 바가 업데이트 될 때마다 음악이 지연됩니다 (매초마다).

package com.dionisie.sounddemo; 

import android.content.Context; import android.media.AudioManager; 
import android.support.v7.app.AppCompatActivity; import 
android.os.Bundle; import android.media.MediaPlayer; import 
android.view.View; import android.widget.SeekBar; import 
android.widget.SeekBar.OnSeekBarChangeListener; import 
android.util.Log; 

import java.util.Timer; import java.util.TimerTask; 

public class MainActivity extends AppCompatActivity { 

    MediaPlayer mplayer; 

    AudioManager audioManager; 

    public void playAudio(View view) { 
     mplayer.start(); 
    } 


    public void pauseAudio(View view) { 
     mplayer.pause(); 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mplayer = MediaPlayer.create(this, R.raw.joanna); 

     audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 

     SeekBar volumeControl = (SeekBar) findViewById(R.id.seekBar); 
     volumeControl.setMax(maxVolume); 
     volumeControl.setProgress(curVolume); 

     volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

       audioManager.setStreamVolume(audioManager.STREAM_MUSIC, progress, 0); 

      } 
     }); 


     final SeekBar scrubber = (SeekBar) findViewById(R.id.scrubber); 

     scrubber.setMax(mplayer.getDuration()); 

     new Timer().scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       scrubber.setProgress(mplayer.getCurrentPosition()); 
      } 
     }, 0, 1000); 

     scrubber.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
       mplayer.seekTo(progress); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 

    } } 

답변

0

우선 첫째, int save, boolean flag

변화 당신의 setOnSeekBarChangeListener

volumeControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      save = progress; 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      mplayer.pause(); 
      flag = true; 


     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      mplayer.seekTo(save); 
      mplayer.start(); 
     } 
    }); 

에 공개 INT 및 공공 부울을 정의하고 다음 Timer().scheduleAtFixedRate을 변경 : 여기

내 코드입니다 이 (if 문 추가)

new Timer().scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 

      if (!flag) 
       scrubber.setProgress(mplayer.getCurrentPosition()); 

     } 
    },0 ,1000); 

및 완료! 변경 이유를 이해하고 싶습니다. 하지만 당신이 묻지 않았다면.