2016-09-12 12 views
-1

В основном я использую панели поиска, чтобы показать пользователю, как воспроизведение звука происходит, мое визуальное обновление представлено в Thread и выглядит следующим образом:SeekBar дергается во время воспроизведения

@Override 
public void run() { 
    while(mUpdating) { 
     if(mSeekBar != null) { 
      mSeekBar.setProgress(mAudioPlaybackManager.getCurrentPosition()); 
     } 
     //Other stuff is updating 
    } 
} 

Так, если пользователь exqample воспроизводит звук, это 2500 мс в длину, это SeekBar максимальное значение будет 2500, и это будет обновлять каждые мс

Этот же код работает гораздо медленнее runOnUiThread, поэтому я предполагаю, когда прогресс меняется что-то вроде postInvalidate, называется

Таким образом, в основном каждый мс, значение параметра поиска должно быть изменено. Наверное, в этом проблема. На моем устройстве Samsung J7 он работает плавно, но на Samsung Galaxy S5 он просто останавливается и прыгает все время, например, если бы я поставил этот код в runOnUIThread, это было бы очень медленно.

Что я могу сделать, чтобы сделать его более плавным? Есть ли еще View, которые я могу использовать для этого pirpose?

То, что текущий SeekBar делает:

  • Отображение прогресса аудио в основном в while(updating)

  • Когда пользователь изменяет положение SeekBar звука начинается с этой точки.

ответ

0

Нить является рабочим потоком, а не потоком пользовательского интерфейса, вы управляете компонентом пользовательского интерфейса внутри потока, тем самым блокируя поток пользовательского интерфейса.

Если вы хотите обновить панель поиска, обновите ее в потоке пользовательского интерфейса. Это можно сделать с помощью обработчика потока пользовательского интерфейса.

Например

private Runnable updateSeekBarTime = new Runnable() { 
     public void run() { 
      //get current position 
      timeElapsed = mediaPlayer.getCurrentPosition(); 
      //set seekbar progress 
      seekbar.setProgress((int) timeElapsed); 

     //repeat yourself again in 100 miliseconds 
     durationHandler.postDelayed(this, 100); 
     } 
    }; 

Выполненный в

public void play(View view) { 

     mediaPlayer.start(); 

     while(mUpdating) { 
      if(mSeekBar != null) { 
      // post the Runnable (updateSeekBarTime) 
      durationHandler.postDelayed(updateSeekBarTime, 100); 
      } 
     } 
    } 

Также обновление компонента не может быть просто сделать каждую миллисекунду, с точки зрения пользователя, давая немного паузы не будет замечена.

+0

Итак, используя наш подход: с задержкой он очень медленный и медленный, если я не установил никакой задержки или 1 мс, он будет плавным, но я не думаю, что есть разница с Thread, мы должны увидеть, будет ли это работать на этом устройстве, я не уверен в этом –

+0

Не могли бы вы предоставить больше своих кодов, чтобы я мог имитировать его, я подозреваю, что в этом 'mUpdating'е что-то не так, что могло бы задержать операцию в поисковом баре. Быстрое обновление в пользовательском интерфейсе всегда было проблемой, хотя в некоторых случаях работа будет безупречно из-за быстрой/хорошей поддержки жесткого диска на самом устройстве. –