2012-04-03 10 views
8

क्या मीडिया खेलते समय प्रोग्रेसबार अपडेट करने का यह सही तरीका है? मैंने सोचा कि मीडियाप्लेयर में कॉलबैक होगा, लेकिन मुझे यह नहीं मिला।मीडियाप्लेयर, प्रोग्रेसबार

mediaPlayer.start(); 
final SeekBar progress = (SeekBar) dialog.findViewById(R.id.seekBar1); 
progress.setMax(mediaPlayer.getDuration()); 
new CountDownTimer(mediaPlayer.getDuration(), 250) { 
    public void onTick(long millisUntilFinished) { 
    progress.setProgress(progress.getProgress() + 250); 
    } 
    public void onFinish() {} 
}.start(); 

सर्वश्रेष्ठ संबंध।

उत्तर

10

android.widget.MediaController पर एक नजर डालें, तो यह एक प्रगति बार है।

वे एक हैंडलर का उपयोग करते हैं जो उपयुक्त होने पर खुद को कॉल करता है। आप देरी सेट कर सकते हैं हालांकि अक्सर आप प्रगति पट्टी को अपडेट करना चाहते हैं।

ध्यान दें कि नियंत्रक को दिखाया जा सकता है या छुपाया जा सकता है साथ ही उपयोगकर्ता द्वारा खींचा जा सकता है, और - ज़ाहिर है - वीडियो रुक सकता है। बार को अपडेट करने के लिए एक और रिकर्सिव कॉल से पहले विभिन्न चेक (!mDragging && mShowing && mVideoView.isPlaying()) के कारण ये हैं।

protected Handler mHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     int pos; 
     switch (msg.what) 
     { 
      // ... 

      case SHOW_PROGRESS: 
       pos = setProgress(); 
       if (!mDragging && mShowing && mVideoView.isPlaying()) 
       { 
        msg = obtainMessage(SHOW_PROGRESS); 
        sendMessageDelayed(msg, 1000 - (pos % 1000)); 
       } 
       break; 

      // ... 
     } 
    } 
}; 

इसे बंद उपयोग शुरू करने के लिए:

mHandler.sendEmptyMessage(SHOW_PROGRESS); 

यह अपने आप में बंद हो जाएगा, लेकिन आप का उपयोग कर पिछले लंबित अनुरोध रद्द करना चाहिए:

mHandler.removeMessages(SHOW_PROGRESS); 
+1

धन्यवाद, ठीक है, मैं क्या देख रहा था। – pouzzler

+0

@pouzzler - आपका स्वागत है! कस्टम नियंत्रक बनाने पर विचार देने के लिए MediaController क्लास को देखना बहुत अच्छा है। –

+0

डीएमसीए निकासी के कारण दूसरा लिंक चला गया है: https://github.com/OESF/OHA-Android-4.0.1_r1.0 – astromme

16

व्यक्तिगत रूप से, मैं एक धागा है कि getCurrentPosition() हर 200 मि.से या तो जाँच करता है जब तक onCompletion() घटना बंद निकाल दिया जाता शुरू:

private class MediaObserver implements Runnable { 
    private AtomicBoolean stop = new AtomicBoolean(false); 

    public void stop() { 
    stop.set(true); 
    } 

    @Override 
    public void run() { 
    while (!stop.get()) { 
     progress.setProgress(mediaPlayer.getCurrentPosition()); 
     Thread.sleep(200); 
    } 
    } 
} 

private MediaObserver observer = null; 

public void runMedia() { 
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener{ 
    @Override 
    public void onCompletion(MediaPlayer mPlayer) { 
     observer.stop(); 
     progress.setProgress(mPlayer.getCurrentPosition()); 
    } 
    }); 
    observer = new MediaObserver(); 
    mediaPlayer.start(); 
    new Thread(observer).start(); 
} 
+0

है टाइमर यूआई ब्लॉक नहीं करता तो मुझे लगता है कि यह एक और धागा में है । तो मुझे लगता है कि यह वही है। काश मैं इन चीज़ों को समझने के लिए पर्याप्त बुद्धिमान था। – pouzzler

+0

@pouzzler काउंटडाउन टाइमर दूसरे धागे में चलता है, केवल अंतर यह है कि यह वास्तविक प्रगति का उपयोग नहीं करता है। मैं एक थ्रेडेड उदाहरण – JRaymond

+0

आह लिखूंगा, मुझे यह मिल जाएगा। धन्यवाद :) – pouzzler

1

लिए सबसे कारगर तरीका उपयोग करने के लिए है जेआरमंड का जवाब और EventBus

private class MediaObserver implements Runnable { 
    private AtomicBoolean stop = new AtomicBoolean(false); 
    public void stop() { 
     stop.set(true); 
    } 

    @Override public void run() { 
     while (!stop.get()) { 
      try { 
       if (player.isPlaying()) 
       sendMsgToUI(player.getCurrentPosition(), 
          player.getDuration()); 
      } catch (Exception e){e.printStackTrace();} 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { e.printStackTrace(); } 
     } 
    } 
} 

private MediaObserver observer = null; 

public void runMedia() { 
    observer = new MediaObserver(); 
    new Thread(observer).start(); 
} 

//handles all the background threads things for you 
private void sendMsgToUI(int position) { 
    ChangingEvent event = new ChangingEvent(position); 
    EventBus.getDefault().post(event); 
} 

ChangingEvent वर्ग कि कुछ ऐसा दिखाई देगा:

public class ChangingEvent { 
    private int position; 

    public ChangingEvent(int position) { 
     this.position= position; 
    } 

    public int getPosition() { 
     return position; 
    } 
} 

और आपके गतिविधि में या टुकड़ा तुम सब करने की है

class YouClass extends Activity { 
    private EventBus eventBus = EventBus.getDefault(); 
} 

@Override protected void onCreate(Bundle savedInstanceState) { 
    //your code 
    eventBus.register(this); 
} 
//eventbus that updates UI 
public void onEventMainThread(ChangingEvent event) { 
    //seekbar or any other ui element 
    seekBar.setProgress(event.getPosition()); 
} 
+0

मुझे यह दृष्टिकोण पसंद है लेकिन मुझे लगता है कि आप लूप जोड़ने के लिए भूल गए हैं/जबकि यह रन बनाता है() –

+0

से अधिक बार निष्पादित किया जा रहा है ओह, हाँ, यह ध्यान देने के लिए धन्यवाद - मैं इसे अभी ठीक कर दूंगा। –

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