2011-01-09 54 views
14

Tôi đang cố gắng sử dụng SeekBar để hiển thị cả độ dài của bản nhạc do lớp MediaPlayer phát và để cho phép tìm kiếm trong bản nhạc.Android SeekBar setProgress đang khiến MediaPlayer của tôi bỏ qua

Tìm kiếm trong bản nhạc hoạt động tốt. Tuy nhiên, việc cập nhật giá trị tiến trình bằng cách sử dụng setProgress trong khi bản nhạc đang phát có vẻ gây ra một chút bỏ qua.

Trong phương pháp onCreate, tôi tạo một chuỗi có vòng lặp cập nhật giá trị tiến độ của SeekBar cho bản nhạc hiện tại. Vòng lặp này đặt lại khi bản nhạc được thay đổi.

private void createProgressThread() { 

    _progressUpdater = new Runnable() { 
     @Override 
     public void run() { 
      //Exitting is set on destroy 
      while(!_exitting) { 
       _resetProgress = false; 
       if(_player.isPlaying()) { 
        try 
        { 
         int current = 0; 
         int total = _player.getDuration(); 
         progressBar.setMax(total); 
         progressBar.setIndeterminate(false); 

         while(_player!=null && current<total && !_resetProgress){ 
          try { 
           Thread.sleep(1000); //Update once per second 
           current = _player.getCurrentPosition(); 
           //Removing this line, the track plays normally. 
           progressBar.setProgress(current); 
          } catch (InterruptedException e) { 

          } catch (Exception e){ 

          }    
         } 
        } 
        catch(Exception e) 
        { 
         //Don't want this thread to intefere with the rest of the app. 
        } 
       } 
      } 
     } 
    }; 
    Thread thread = new Thread(_progressUpdater); 
    thread.start(); 
} 

Lý tưởng nhất là tôi không muốn sử dụng chuỗi khi tôi hiểu rằng điều này có bất lợi. Ngoài ra xin vui lòng tha thứ cho việc nuốt ngoại lệ - rất khó để kiểm tra tất cả các trạng thái của MediaPlayer theo các sự kiện giao diện người dùng. Tuy nhiên, vấn đề thực sự của tôi là âm nhạc bị bỏ qua.

Ai đó có thể đề xuất một cách khác để cập nhật tiến trình và giải thích lý do tại sao cuộc gọi đến setProgress đang khiến bài hát bỏ qua ngay cả khi sử dụng chuỗi riêng biệt?

Xin cảm ơn trước.

Trả lời

23

Tôi nghĩ vấn đề là khi bạn gọi setProgress(), sự kiện onProgressChanged được kích hoạt.

Trình nghe (OnSeekBarChangeListener) có phương thức khoảng trống công cộng onProgressChanged (Tìm kiếmBar, tiến trình, boolean fromUser). Ở đây bạn nên kiểm tra xem người nghe có được kích hoạt bởi một hành động của người dùng hoặc từ mã không. Trong trường hợp của bạn, biến fromUser phải là false.

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    if(fromUser){ 
      player.seekTo(x); 
     } 
     else{ 
     // the event was fired from code and you shouldn't call player.seekTo() 
     } 
} 
+0

Bật. Cảm ơn bạn. –

+0

BRILLIANT, tìm thấy vấn đề này sau một ngày gỡ lỗi bất lực điên cuồng! :) Cảm ơn bạn. – Soham

Các vấn đề liên quan