इस पेज पर, DefaultPreloadManager बनाने का तरीका बताया गया है. यह आपकी चुनी गई रणनीति के आधार पर, आपके ऐप्लिकेशन के लिए मीडिया कॉन्टेंट को पहले से लोड करता है.
BasePreloadManager ऐब्स्ट्रैक्ट क्लास पर आधारित प्रीलोड मैनेजर, आपकी चुनी गई शर्तों के हिसाब से कॉन्टेंट को रैंक करने की सुविधा देते हैं. इस दस्तावेज़ में, डिराइव की गई क्लास DefaultPreloadManager का इस्तेमाल करने का तरीका बताया गया है. इसमें हर मीडिया आइटम को एक पूर्णांक के साथ रैंक किया जाता है. यह पूर्णांक, सूची में उसकी जगह दिखाता है. उदाहरण के लिए, वीडियो कैरसेल में उसकी पोज़िशन. प्रीलोड मैनेजर, आइटम को लोड करने के लिए प्राथमिकता तय करता है. यह प्राथमिकता, इस आधार पर तय की जाती है कि वह आइटम, फ़िलहाल उपयोगकर्ता के चलाए जा रहे आइटम के कितने करीब है. इससे, अगर कोई उपयोगकर्ता किसी दूसरे आइटम पर जाता है, तो नया आइटम तुरंत चलना शुरू हो जाता है.
DefaultPreloadManager का इंस्टेंस बनाने के तीन चरण हैं:
- `TargetPreloadStatusControl` तय करें. प्रीलोड मैनेजर, इससे क्वेरी करके यह पता लगा सकता है कि मीडिया आइटम लोड होने के लिए तैयार है या नहीं. साथ ही, यह भी पता लगा सकता है कि उसे कितना लोड करना है.
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 (पिछला मीडिया आइटम): डिफ़ॉल्ट शुरुआती पोज़िशन से 1000 मिसेकंड (1 सेकंड) लोड करें
- n-2 से n+2 की रेंज में मौजूद अन्य मीडिया आइटम:
PreloadStatus.TRACKS_SELECTEDदिखाएं - n-4 से n+4 की रेंज में मौजूद अन्य मीडिया आइटम:
PreloadStatus.SOURCE_PREPAREDदिखाएं - अन्य सभी मीडिया आइटम के लिए,
nullदिखाएं
class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) : 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.PRELOAD_STATUS_TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED } return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED } }
कोड के बारे में अहम बातें
- प्रीलोड मैनेजर बिल्डर बनाते समय, आपको उसे
MyTargetPreloadStatusControlका एक इंस्टेंस पास करना होगा. currentPlayingIndexमें, फ़िलहाल चल रहे मीडिया आइटम का इंडेक्स होता है. इस वैल्यू को अप-टू-डेट रखना, ऐप्लिकेशन की ज़िम्मेदारी है.- जब प्रीलोड मैनेजर, कॉन्टेंट लोड करने के लिए तैयार होता है, तब वह
getTargetPreloadStatusको कॉल करता है. साथ ही, उस मीडिया आइटम के लिए तय की गई रैंकिंग की जानकारी पास करता है.DefaultPreloadManagerके मामले में, रैंकिंग की जानकारी एक पूर्णांक होती है. यह पूर्णांक, कैरसेल में आइटम की पोज़िशन तय करता है. यह तरीका, फ़िलहाल चुने गए आइटम के इंडेक्स के साथ उस इंडेक्स की तुलना करके यह तय करता है कि कौन-सा कोड दिखाना है.
प्रीलोड मैनेजर बनाना
अपना प्रीलोड मैनेजर बनाने के लिए, आपको DefaultPreloadManager.Builder की ज़रूरत होगी.
इस बिल्डर को, मौजूदा कॉन्टेक्स्ट और ऐप्लिकेशन के टारगेट प्रीलोड स्टेटस कंट्रोल के साथ कॉन्फ़िगर किया जाता है. बिल्डर, सेटर के तरीके भी उपलब्ध कराता है. इनका इस्तेमाल, प्रीलोड मैनेजर के कस्टम कॉम्पोनेंट सेट करने के लिए किया जा सकता है.
प्रीलोड मैनेजर बनाने के लिए बिल्डर का इस्तेमाल करने के अलावा, इसका इस्तेमाल उन
ExoPlayer ऑब्जेक्ट को बनाने के लिए भी किया जाएगा जिनका इस्तेमाल आपका ऐप्लिकेशन, कॉन्टेंट चलाने के लिए करता है.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
कोड के बारे में अहम बातें
MyTargetPreloadStatusControlवह क्लास है जिसे आपने टारगेट प्रीलोड स्टेटस कंट्रोल बनाना में तय किया था.- उसी
DefaultPreloadManager.Builderका इस्तेमाल,ExoPlayerऑब्जेक्ट बनाने के लिए किया जाएगा. ये ऑब्जेक्ट, उस प्रीलोड मैनेजर से मैनेज किया गया कॉन्टेंट चलाएंगे.