2016-10-13 9 views
0

Только что начал изучать Java, и в настоящее время я изучаю некоторые мультимедийные материалы. Я создал небольшое приложение (которое играет музыкальный файл) с помощью панели поиска регулятора громкости, которая отлично работает, кнопка воспроизведения и остановки, которая также отлично работает. Мне удалось добраться до этого момента, когда музыка воспроизводится, прогресс в поиске обновляется и перемещается вправо, как это нужно делать, когда играет песня. Когда вы хотите добавить код, чтобы реально изменить ход музыки, я получаю паузу (задержку) каждый раз, когда поиск обновляется (каждые 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 и общественное логическое 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(); 
     } 
    }); 

А затем измените Timer().scheduleAtFixedRate к этому (добавлено заявление if)

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

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

     } 
    },0 ,1000); 

и СОВЕРШЕННО! Надеюсь понять причину изменения. Но если бы вы не просто спросили.