कॉन्टेंट मैनेज करना और उसे चलाना

इस पेज पर, वीडियो कॉन्टेंट को मैनेज करने के लिए प्रीलोड मैनेजर का इस्तेमाल करने का तरीका बताया गया है. प्रीलोड मैनेजर का इस्तेमाल करके, उपयोगकर्ता को बेहतर अनुभव दिया जा सकता है. जब उपयोगकर्ता एक मीडिया आइटम से दूसरे पर स्विच करता है, तो मैनेजर पहले ही कुछ कॉन्टेंट लोड कर लेता है. इसलिए, मीडिया आइटम तेज़ी से चलने लगता है.

इस पेज पर इन विषयों के बारे में बताया गया है:

प्रीलोड मैनेजर में मीडिया आइटम जोड़ना

आपको प्रीलोड मैनेजर को हर उस मीडिया आइटम के बारे में बताना होगा जिसे वह ट्रैक करेगा. उदाहरण के लिए, अगर आपके ऐप्लिकेशन में वीडियो का कैरसेल है, तो उन वीडियो को प्रीलोड मैनेजर में जोड़ें. इस्तेमाल के उदाहरण के आधार पर, हो सकता है कि आपको सभी वीडियो जोड़ने हों या सिर्फ़ वे वीडियो जोड़ने हों जो फ़िलहाल चल रहे वीडियो के आस-पास हैं. प्रीलोड मैनेजर में, बाद में भी नए आइटम जोड़े जा सकते हैं.

मीडिया आइटम जोड़ने से, प्रीलोड मैनेजर अपने-आप कॉन्टेंट लोड करना शुरू नहीं करता. प्रीलोडिंग को ट्रिगर करने के लिए, आपको प्रीलोड मैनेजर में मौजूद प्राथमिकताओं को अमान्य करना होगा.

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

कोड के बारे में अहम जानकारी

  • इस स्निपेट में बताया गया है कि प्रीलोड मैनेजर बनाने के बाद, उसे शुरुआती तौर पर कैसे पॉप्युलेट करें. मौजूदा और पहले से भरे गए प्रीलोड मैनेजर में आइटम जोड़ने के लिए, add() को भी कॉल किया जा सकता है.
  • इस स्निपेट में, pullMediaItemsFromService() ऐप्लिकेशन का लॉजिक है, जो चलाने के लिए कॉन्टेंट की सूची फ़ेच करता है. यह कोड, उस तरीके को कॉल करके ज़्यादा से ज़्यादा 20 आइटम की सूची फ़ेच करता है.
  • preloadManager, DefaultPreloadManager बनाएं में बनाया गया DefaultPreloadManager है. यह कोड, उस मैनेजर के add() तरीके को कॉल करता है, ताकि कैरसेल में हर आइटम को जोड़ा जा सके.
  • rankingData एक ऐसी वैल्यू है जिसका इस्तेमाल प्रीलोड मैनेजर, हर मीडिया आइटम की प्राथमिकता तय करने के लिए करता है. DefaultPreloadManager के लिए, rankingData एक पूर्णांक है. यह कैरसेल में आइटम की जगह दिखाता है. प्रीलोड मैनेजर, प्राथमिकता तय करता है. इसके लिए, वह यह देखता है कि फ़िलहाल चल रहा आइटम, हर आइटम से कितनी दूर है.

प्रीलोड मैनेजर में प्राथमिकताओं को अमान्य करना

प्रीलोड मैनेजर को कॉन्टेंट प्रीलोड करने के लिए ट्रिगर करने के लिए, आपको invalidate() को कॉल करना होगा. इससे प्रीलोड मैनेजर को पता चलेगा कि आइटम की प्राथमिकताएं पुरानी हो गई हैं. आपको इन स्थितियों में ऐसा करना चाहिए:

  • प्रीलोड मैनेजर में नए मीडिया आइटम जोड़ने या मीडिया आइटम हटाने पर. अगर आपको कई आइटम जोड़ने या हटाने हैं, तो आपको उन सभी को जोड़ना चाहिए. इसके बाद, invalidate() को कॉल करें.
  • जब उपयोगकर्ता एक मीडिया आइटम से दूसरे मीडिया आइटम पर स्विच करता है. ऐसे में, आपको invalidate() को कॉल करने से पहले, मौजूदा प्लेइंग इंडेक्स को अपडेट करना होगा. इसके बारे में कॉन्टेंट फ़ेच करना और उसे चलाना लेख में बताया गया है.

प्रीलोड मैनेजर को अमान्य करने पर, यह TargetPreloadStatusControl को कॉल करता है. इससे यह पता चलता है कि इसे हर आइटम से कितना कॉन्टेंट लोड करना चाहिए. इसके बाद, यह हर आइटम के लिए कॉन्टेंट को प्राथमिकता के क्रम में लोड करता है. यह क्रम, ज़्यादा से कम प्राथमिकता वाला होता है.

preloadManager.invalidate()

कोड के बारे में अहम जानकारी

  • invalidate() को कॉल करने पर, प्रीलोड मैनेजर उन सभी मीडिया आइटम की प्राथमिकता का फिर से आकलन करता है जिनके बारे में उसे पता है. इस वजह से, अगर आपको प्रीलोड मैनेजर में कई बदलाव करने हैं, तो invalidate() को कॉल करने से पहले, आपको बदलाव पूरे कर लेने चाहिए.

मीडिया फ़ेच करना और चलाना

जब उपयोगकर्ता किसी नए मीडिया आइटम पर जाता है, तो आपको प्रीलोड मैनेजर से मीडिया आइटम पाना होगा. अगर प्रीलोड मैनेजर ने कोई कॉन्टेंट लोड किया है, तो वह कॉन्टेंट, प्रीलोड मैनेजर का इस्तेमाल न करने पर लोड होने वाले कॉन्टेंट की तुलना में ज़्यादा तेज़ी से चलेगा. अगर प्रीलोड मैनेजर ने अब तक उस आइटम से कॉन्टेंट लोड नहीं किया है, तो कॉन्टेंट सामान्य रूप से चलेगा.

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

कोड के बारे में अहम जानकारी

  • player, Media3 ExoPlayer है. इसका इस्तेमाल ऐप्लिकेशन, कॉन्टेंट चलाने के लिए करता है. आपको उस प्लेयर को बनाने के लिए, उसी बिल्डर पर DefaultPreloadManager.Builder.buildExoPlayer() को कॉल करना होगा जिसका इस्तेमाल आपने प्रीलोड मैनेजर बनाने के लिए किया था.
  • जब उपयोगकर्ता किसी नए मीडिया आइटम पर स्विच करता है, तो ऐप्लिकेशन, प्रीलोड मैनेजर से मीडिया सोर्स पाने के लिए getMediaSource() को कॉल करता है. यह ऐसा mediaItem होना चाहिए जिसे आपने प्रीलोड मैनेजर में पहले ही जोड़ दिया हो. अगर प्रीलोड मैनेजर ने पहले से ही कॉन्टेंट लोड करना शुरू नहीं किया है, तो कोई समस्या नहीं है. ऐसे में, यह MediaSource दिखाता है, जिसमें प्रीलोड किया गया डेटा नहीं होता. उदाहरण के लिए, ऐसा तब हो सकता है, जब उपयोगकर्ता अचानक कैरसेल में बहुत आगे बढ़ जाए.
  • जब उपयोगकर्ता नया मीडिया आइटम चला लेता है, तब setCurrentPlayingIndex को कॉल करके, प्रीलोड मैनेजर को बताएं कि कैरसेल में नया आइटम कहां है. प्रीलोड मैनेजर को इस जानकारी की ज़रूरत होती है, ताकि वह अगले आइटम को लोड करने को प्राथमिकता दे सके. मौजूदा इंडेक्स को अपडेट करने के बाद, call invalidate() करें, ताकि प्रीलोड मैनेजर हर आइटम के लिए प्राथमिकता तय कर सके.

प्रीलोड मैनेजर से आइटम हटाना

प्रीलोड मैनेजर को बेहतर तरीके से काम करने देने के लिए, आपको उन आइटम को हटाना चाहिए जिन्हें प्रीलोड मैनेजर को अब ट्रैक करने की ज़रूरत नहीं है. आपके पास उन आइटम को भी हटाने का विकल्प होता है जो अब भी कैरसेल में दिख रहे हैं, लेकिन उपयोगकर्ता की मौजूदा जगह से बहुत दूर हैं. उदाहरण के लिए, ऐसा हो सकता है कि आपने यह तय किया हो कि अगर कोई आइटम, उपयोगकर्ता के देखे जा रहे कॉन्टेंट से 15 आइटम से ज़्यादा दूर है, तो उसे पहले से लोड करने की ज़रूरत नहीं है. ऐसे में, आइटम को तब हटाया जाएगा, जब वह बहुत दूर चला जाएगा. अगर उपयोगकर्ता उन आइटम की ओर वापस जाता है जिन्हें हटाया गया था, तो आपके पास उन्हें फिर से जोड़ने का विकल्प होता है.

preloadManager.remove(mediaItem)

कोड के बारे में अहम जानकारी

प्रीलोड मैनेजर का इस्तेमाल पूरा होने के बाद उसे रिलीज़ करना

जब आपको प्रीलोड मैनेजर की ज़रूरत न हो, तो आपको उसे रिलीज़ करना होगा, ताकि उसके संसाधनों को खाली किया जा सके. खास तौर पर, जब आपकी गतिविधि बंद हो जाए, तब इसे रिलीज़ करना न भूलें.

preloadManager.release()

कोड के बारे में अहम जानकारी

  • ऑब्जेक्ट को रिलीज़ करने के बाद, आपको उसके किसी भी तरीके को कॉल नहीं करना चाहिए.
  • अगर आपको कोई दूसरा प्रीलोड मैनेजर बनाना है, तो नया DefaultPreloadManager.Builder बनाएं और उसका इस्तेमाल करके DefaultPreloadManager बनाएं. पुराने बिल्डर का फिर से इस्तेमाल न करें.