इस पेज पर, DefaultPreloadManager
बनाने का तरीका बताया गया है. यह आपकी चुनी गई रणनीति के आधार पर, आपके ऐप्लिकेशन के लिए मीडिया कॉन्टेंट को पहले से लोड करता है.
BasePreloadManager
ऐब्स्ट्रैक्ट क्लास पर आधारित प्रीलोड मैनेजर की मदद से, अपनी चुनी गई शर्तों के हिसाब से कॉन्टेंट को रैंक किया जा सकता है. इस दस्तावेज़ में, डिराइव की गई क्लास DefaultPreloadManager
का इस्तेमाल करने का तरीका बताया गया है. इसमें हर मीडिया आइटम को एक पूर्णांक के साथ रैंक किया जाता है. यह पूर्णांक, सूची में उसकी जगह दिखाता है. उदाहरण के लिए, वीडियो कैरसेल में उसकी पोज़िशन. प्रीलोड मैनेजर, आइटम को लोड करने के लिए प्राथमिकता तय करता है. यह प्राथमिकता इस आधार पर तय की जाती है कि आइटम, उपयोगकर्ता के मौजूदा आइटम से कितना मिलता-जुलता है. इस तरह, अगर कोई उपयोगकर्ता किसी दूसरे आइटम पर जाता है, तो नया आइटम तुरंत चलना शुरू हो सकता है.
DefaultPreloadManager
का इंस्टेंस बनाने के लिए, ये तीन चरण पूरे करें:
- एक
TargetPreloadStatusControl
तय करें, ताकि प्रीलोड मैनेजर यह क्वेरी कर सके कि मीडिया आइटम लोड होने के लिए तैयार है या नहीं. साथ ही, यह भी पता लगा सके कि कितना डेटा लोड करना है. - बिल्डर बनाएं. इसका इस्तेमाल प्रीलोड मैनेजर बनाने के लिए किया जाएगा. साथ ही, इसका इस्तेमाल अपने ऐप्लिकेशन के
ExoPlayer
ऑब्जेक्ट बनाने के लिए भी किया जाएगा. - बिल्डर के
build()
तरीके को कॉल करके, प्रीलोड मैनेजर बनाने के लिए बिल्डर का इस्तेमाल करें.
प्रीलोड करने की स्थिति को टारगेट करने वाला कंट्रोल बनाना
DefaultPreloadManager.Builder
बनाते समय, आपको इसे टारगेट प्रीलोड स्टेटस कंट्रोल ऑब्जेक्ट पास करना होगा. यह ऑब्जेक्ट, TargetPreloadStatusControl
इंटरफ़ेस लागू करता है. जब प्रीलोड मैनेजर मीडिया को प्रीलोड करने की तैयारी करता है, तो वह आपके स्टेटस कंट्रोल के getTargetPreloadStatus()
तरीके को कॉल करता है. इससे यह पता चलता है कि कितना कॉन्टेंट लोड करना है. स्टेटस कंट्रोल, इनमें से किसी एक स्टेटस कोड के साथ जवाब दे सकता है:
STAGE_SPECIFIED_RANGE_LOADED
: प्रीलोड मैनेजर को, बताई गई शुरुआती पोज़िशन से और बताई गई अवधि (मिलीसेकंड में दी गई) के लिए कॉन्टेंट लोड करना चाहिए.STAGE_TRACKS_SELECTED
: प्रीलोड मैनेजर को कॉन्टेंट ट्रैक की जानकारी लोड और प्रोसेस करनी चाहिए. साथ ही, ट्रैक चुनने चाहिए. प्रीलोड मैनेजर को अभी कॉन्टेंट लोड करना शुरू नहीं करना चाहिए.STAGE_SOURCE_PREPARED
: प्रीलोड मैनेजर को कॉन्टेंट सोर्स तैयार करना चाहिए. उदाहरण के लिए, अगर कॉन्टेंट का मेटाडेटा किसी अलग मेनिफ़ेस्ट फ़ाइल में है, तो प्रीलोड मैनेजर उस मेनिफ़ेस्ट को फ़ेच और पार्स कर सकता है.null
: प्रीलोड मैनेजर को उस मीडिया आइटम के लिए कोई कॉन्टेंट या मेटाडेटा लोड नहीं करना चाहिए.
आपको यह तय करने के लिए एक रणनीति बनानी होगी कि हर मीडिया आइटम के लिए कितना कॉन्टेंट लोड करना है. इस उदाहरण में, फ़िलहाल चल रहे आइटम के सबसे नज़दीक मौजूद आइटम के लिए ज़्यादा कॉन्टेंट लोड किया गया है. अगर उपयोगकर्ता इंडेक्स n वाला कॉन्टेंट चला रहा है, तो कंट्रोलर ये कोड दिखाता है:
- इंडेक्स n+1 (अगला मीडिया आइटम): डिफ़ॉल्ट शुरुआती पोज़िशन से 3000 मि॰से॰ (3 सेकंड) लोड करें
- इंडेक्स n-1 (पिछला मीडिया आइटम): डिफ़ॉल्ट शुरुआती पोज़िशन से 1,000 मि॰से॰ (एक सेकंड) लोड करें
- रेंज n-2 से n+2 में मौजूद अन्य मीडिया आइटम: Return
PreloadStatus.TRACKS_SELECTED
- n-4 से n+4 के बीच के अन्य मीडिया आइटम:
PreloadStatus.SOURCE_PREPARED
दिखाएं - अन्य सभी मीडिया आइटम के लिए,
null
एट्रिब्यूट की वैल्यू के तौर पर
class MyTargetPreloadStatusControl(
currentPlayingIndex: Int = C.INDEX_UNSET
): TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {
override fun getTargetPreloadStatus(index: Int):
DefaultPreloadManager.PreloadStatus? {
if (index - currentPlayingIndex == 1) { // next track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (index - currentPlayingIndex == -1) { // previous track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (abs(index - currentPlayingIndex) == 2) {
// return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
} else if (abs(index - currentPlayingIndex) <= 4) {
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
}
return null
}
}
कोड के बारे में अहम जानकारी
MyTargetPreloadStatusControl
का इंस्टेंस, प्रीलोड मैनेजर बिल्डर को तब पास किया जाएगा, जब उसे बनाया जाएगा.currentPlayingIndex
में उस मीडिया आइटम का इंडेक्स होता है जो फ़िलहाल चल रहा है. ऐप्लिकेशन का काम, उस वैल्यू को अप-टू-डेट रखना है.- जब प्रीलोड मैनेजर, कॉन्टेंट लोड करने के लिए तैयार होता है, तब वह
getTargetPreloadStatus
को कॉल करता है. साथ ही, उस मीडिया आइटम के लिए आपने रैंकिंग की जो जानकारी दी है उसे पास करता है.DefaultPreloadManager
के मामले में, रैंकिंग की जानकारी एक पूर्णांक होती है. इससे कैरसेल में आइटम की पोज़िशन के बारे में पता चलता है. यह तरीका, यह तय करता है कि कौन सा कोड वापस भेजना है. इसके लिए, यह उस इंडेक्स की तुलना, फ़िलहाल चुने गए आइटम के इंडेक्स से करता है.
प्रीलोड मैनेजर बनाना
प्रीलोड मैनेजर बनाने के लिए, आपको DefaultPreloadManager.Builder
की ज़रूरत होगी.
इस बिल्डर को मौजूदा कॉन्टेक्स्ट और ऐप्लिकेशन के टारगेट प्रीलोड स्टेटस कंट्रोल के साथ कॉन्फ़िगर किया जाता है. बिल्डर, सेटर के तरीके भी उपलब्ध कराता है. इनका इस्तेमाल, प्रीलोड मैनेजर के कस्टम कॉम्पोनेंट सेट करने के लिए किया जा सकता है.
प्रीलोड मैनेजर बनाने के लिए बिल्डर का इस्तेमाल करने के अलावा, इसका इस्तेमाल ExoPlayer
ऑब्जेक्ट बनाने के लिए भी किया जाएगा. आपका ऐप्लिकेशन, कॉन्टेंट चलाने के लिए इन ऑब्जेक्ट का इस्तेमाल करता है.
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
कोड के बारे में अहम जानकारी
MyTargetPreloadStatusControl
वह क्लास है जिसे आपने टारगेट प्रीलोड स्टेटस कंट्रोल बनाएं में तय किया है.- आपको उसी
DefaultPreloadManager.Builder
का इस्तेमाल करकेExoPlayer
ऑब्जेक्ट बनाने होंगे. ये ऑब्जेक्ट, प्रीलोड मैनेजर से मैनेज किया गया कॉन्टेंट चलाएंगे.