2011-01-09 12 views
14

छोड़ने का कारण बन रहा है। मैं मीडियाप्लेयर क्लास द्वारा खेले गए ट्रैक की लंबाई और ट्रैक के भीतर खोज करने के लिए एक सेकरबार का उपयोग करने की कोशिश कर रहा हूं।एंड्रॉइड सीकबार सेट प्रोग्रेस मेरे मीडियाप्लेयर को

ट्रैक के भीतर की तलाश अच्छी तरह से काम करता है। हालांकि, ट्रैक चल रहा है, जबकि सेट प्रोग्रेस का उपयोग कर प्रगति मूल्य को अद्यतन करना थोड़ा सा कारण लगता है।

ऑनक्रेट विधि में मैं एक लूप के साथ एक थ्रेड बनाता हूं जो वर्तमान ट्रैक के लिए सेकरबार के प्रगति मूल्य को अद्यतन करता है। जब ट्रैक बदल जाता है तो यह पाश रीसेट हो जाता है।

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(); 
} 

आदर्श रूप से मैं धागे का उपयोग नहीं करता क्योंकि मैं समझता हूं कि इसका नुकसान है। कृपया निगलने के अपवाद को क्षमा करें - यूआई घटनाओं के जवाब में सभी मीडियाप्लेयर राज्यों की जांच करना मुश्किल है। हालांकि, मेरी असली समस्या यह है कि संगीत छोड़ रहा है।

क्या कोई भी प्रगति को अपडेट करने का एक वैकल्पिक तरीका सुझा सकता है और समझा सकता है कि सेट प्रोग्रेस को कॉल क्यों एक अलग धागे के उपयोग के साथ ट्रैक को छोड़ने का कारण बन रहा है?

अग्रिम धन्यवाद।

उत्तर

23

मुझे लगता है कि समस्या यह है कि जब आप setProgress() को कॉल करते हैं, तो ऑन प्रोग्रेस चेंजेड ईवेंट निकाल दिया जाता है।

श्रोता (ऑनसेकबैंच चेंजनर) की विधि सार्वजनिक शून्य पर प्रगति की गई है (SeekBar seekBar, int progress, Boolean fromUser)। यहां आपको परीक्षण करना चाहिए कि श्रोता को उपयोगकर्ता कार्रवाई या कोड से निकाल दिया गया था या नहीं। आपके मामले में, यूज़र परिवर्तक से गलत होना चाहिए।

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

स्पॉट ऑन। धन्यवाद। –

+0

ब्रिलियंट, उन्माद असहाय डीबगिंग के एक दिन के बाद इस मुद्दे को मिला! :) धन्यवाद। – Soham

संबंधित मुद्दे