মিডিয়া প্লেব্যাক উন্নত করা: Media3-এর PreloadManager-এর খুঁটিনাটি - পার্ট ২
৯ মিনিট পড়ার সময়
Media3-এর মাধ্যমে মিডিয়া প্রিলোড করার বিষয়ে আমাদের তিন-পার্টের সিরিজের দ্বিতীয় ইনস্টলমেন্টে আপনাকে স্বাগত। এই সিরিজটি আপনার Android অ্যাপে অত্যন্ত প্রতিক্রিয়াশীল, কম-লেটেন্সি মিডিয়া অভিজ্ঞতা তৈরি করার প্রক্রিয়ার মাধ্যমে আপনাকে গাইড করার জন্য ডিজাইন করা হয়েছে।
- পার্ট ১: Media3-এর সাথে প্রিলোডিংয়ের পরিচয়-এ মৌলিক বিষয়গুলি কভার করা হয়েছে। আমরা সাধারণ প্লেলিস্টের জন্য PreloadConfiguration এবং ডায়নামিক ইউজার ইন্টারফেসের জন্য আরও শক্তিশালী DefaultPreloadManager-এর মধ্যে পার্থক্য এক্সপ্লোর করেছি। আপনি শিখেছেন কীভাবে বেসিক API লাইফসাইকেল প্রয়োগ করতে হয়: add() ব্যবহার করে মিডিয়া যোগ করা, getMediaSource() ব্যবহার করে প্রস্তুত MediaSource ফিরিয়ে আনা, setCurrentPlayingIndex() ও invalidate() ব্যবহার করে অগ্রাধিকার ম্যানেজ করা এবং remove() ও release() ব্যবহার করে রিসোর্স রিলিজ করা।
- পার্ট ২ (এই পোস্ট): এই ব্লগে, আমরা DefaultPreloadManager-এর উন্নত ক্ষমতা এক্সপ্লোর করব। আমরা PreloadManagerListener-এর মাধ্যমে কীভাবে ইনসাইট পাওয়া যায়, ExoPlayer-এর সাথে মূল কম্পোনেন্ট শেয়ার করার মতো প্রোডাকশন-রেডি পেশাদার পদ্ধতি প্রয়োগ করা এবং মেমরি কার্যকরভাবে ম্যানেজ করার জন্য স্লাইডিং উইন্ডো প্যাটার্ন আয়ত্ত করা যায় তা কভার করি।
- পার্ট ৩: এই সিরিজের শেষ পার্টে, পারসিস্টেন্ট ডিস্ক ক্যাশের সাথে PreloadManager ইন্টিগ্রেট করার বিষয়ে আলোচনা করা হবে, যার মাধ্যমে আপনি রিসোর্স ম্যানেজমেন্টের সাথে ডেটা খরচ কমাতে এবং বাধাহীন অভিজ্ঞতা প্রদান করতে পারবেন।
আপনি Media3-তে প্রিলোডিংয়ের ক্ষেত্রে নতুন হলে, আমরা আপনাকে পার্ট ১ পড়ার জন্য সাজেস্ট করছি। যারা প্রাথমিক বিষয়গুলি পেরিয়ে আরও এগিয়ে যেতে চান, তাদের জন্য মিডিয়া প্লেব্যাক প্রয়োগ করার পদ্ধতি কীভাবে আরও উন্নত করা যায় তা এক্সপ্লোর করা যাক।
শোনা হচ্ছে: PreloadManagerListener-এর মাধ্যমে অ্যানালিটিক্স ফেচ করা
অ্যাপ ডেভেলপার হিসেবে আপনি যখন প্রোডাকশনে কোনও ফিচার লঞ্চ করতে চান, তখন আপনি এর পিছনের অ্যানালিটিক্স বুঝতে এবং ক্যাপচার করতে চান। আপনি কীভাবে নিশ্চিত হবেন যে আপনার প্রি-লোডিং স্ট্র্যাটেজি বাস্তব-জগতের পরিবেশে কার্যকর? এর উত্তর দিতে সাফল্যের হার, ব্যর্থতা ও পারফর্ম্যান্স সংক্রান্ত ডেটা প্রয়োজন। PreloadManagerListener ইন্টারফেস হল এই ডেটা সংগ্রহ করার প্রাথমিক মেকানিজম।
PreloadManagerListener দুটি প্রয়োজনীয় কলব্যাক প্রদান করে যা প্রিলোডিং প্রসেস ও স্ট্যাটাস সম্পর্কে গুরুত্বপূর্ণ ইনসাইট প্রদান করে।
- onCompleted(MediaItem mediaItem): TargetPreloadStatusControl-এ যেভাবে উল্লেখ করা হয়েছে, সেই অনুযায়ী প্রি-লোড করার অনুরোধ সফলভাবে সম্পূর্ণ হলে এই কলব্যাক ইনভোক করা হয়।
- onError(PreloadException error): এই কলব্যাক ডিবাগিং ও মনিটর করার জন্য উপযোগী হতে পারে। প্রি-লোড ব্যর্থ হলে এটি চালু করা হয় এবং সংশ্লিষ্ট ব্যতিক্রম প্রদান করে।
নিচে দেখানো উদাহরণ কোডের মতো আপনি একটি মেথড কলের মাধ্যমে লিসেনার রেজিস্টার করতে পারবেন:
val preloadManagerListener = object : PreloadManagerListener {
override fun onCompleted(mediaItem: MediaItem) {
// Log success for analytics.
Log.d("PreloadAnalytics", "Preload completed for $mediaItem")
}
override fun onError( preloadError: PreloadException) {
// Log the specific error for debugging and monitoring.
Log.e("PreloadAnalytics", "Preload error ", preloadError)
}
}
preloadManager.addListener(preloadManagerListener)শ্রোতার থেকে ইনসাইট এক্সট্র্যাক্ট করা হচ্ছে
এইসব লিসেনার কলব্যাক আপনার অ্যানালিটিক্স পাইপলাইনে হুক করা যেতে পারে। আপনার অ্যানালিটিক্স ইঞ্জিনে এইসব ইভেন্ট ফরওয়ার্ড করার মাধ্যমে, আপনি এইসব গুরুত্বপূর্ণ প্রশ্নের উত্তর দিতে পারবেন:
- আমাদের প্রিলোড সাফল্যের হার কত? (onCompleted ইভেন্ট ও মোট প্রিলোড অ্যাটেম্পটের অনুপাত)
- কোন CDN বা ভিডিও ফর্ম্যাটে সবচেয়ে বেশি সমস্যার হার দেখা যায়? (onError থেকে ব্যতিক্রম পার্স করার মাধ্যমে)
- আমাদের প্রিলোড সংক্রান্ত সমস্যার হার কত? (onError ইভেন্ট ও মোট প্রিলোড প্রচেষ্টার অনুপাত)
এই ডেটা আপনাকে প্রিলোডিং স্ট্র্যাটেজির উপর পরিমাণগত মতামত দিতে পারে, যা A/B টেস্টিং এবং ডেটা-চালিত উন্নতির মাধ্যমে আপনার ব্যবহারকারীর অভিজ্ঞতাকে আরও উন্নত করতে সাহায্য করে। এই ডেটা আপনাকে বুদ্ধিমত্তার সাথে প্রিলোডের সময়সীমা এবং আপনি কতগুলি ভিডিও প্রিলোড করতে চান এবং কত বাফার বরাদ্দ করতে চান তা সূক্ষ্মভাবে টিউন করতে সাহায্য করতে পারে।
ডিবাগিংয়ের বাইরে: UI ফলব্যাক সুন্দরভাবে দেখানোর জন্য onError ব্যবহার করা
প্রিলোড না হলে, ব্যবহারকারীর জন্য আসন্ন বাফারিং ইভেন্টের একটি শক্তিশালী ইঙ্গিত পাওয়া যায়। onError কলব্যাক আপনাকে প্রতিক্রিয়াশীলভাবে উত্তর দিতে দেয়। শুধু সমস্যার লগ রাখার পরিবর্তে, আপনি UI অ্যাডাপ্ট করতে পারেন। যেমন, পরবর্তী ভিডিও প্রি-লোড না হলে, আপনার অ্যাপ্লিকেশন পরবর্তী সোয়াইপের জন্য অটোপ্লে বন্ধ করে দিতে পারে, যার ফলে প্লেব্যাক শুরু করার জন্য ব্যবহারকারীকে ট্যাপ করতে হবে।
এছাড়াও, PreloadException-এর ধরন পরীক্ষা করে আপনি আরও বুদ্ধিদীপ্তভাবে আবার চেষ্টা করার স্ট্র্যাটেজি নির্ধারণ করতে পারবেন। কোনও অ্যাপ, ত্রুটি মেসেজ বা HTTP স্ট্যাটাস কোডের উপর ভিত্তি করে ম্যানেজার থেকে কাজ না করা সোর্স অবিলম্বে সরিয়ে দেওয়ার সিদ্ধান্ত নিতে পারে। আইটেমটি UI স্ট্রিম থেকে সরিয়ে দিতে হবে যাতে লোডিং সংক্রান্ত সমস্যা ব্যবহারকারীর অভিজ্ঞতায় প্রভাব না ফেলে। এছাড়াও, আপনি PreloadException থেকে আরও গ্র্যানুলার ডেটা পেতে পারেন, যেমন HttpDataSourceException, যা আপনাকে সমস্যাগুলি আরও গভীরভাবে তদন্ত করতে সাহায্য করবে। ExoPlayer সংক্রান্ত সমস্যার সমাধান সম্পর্কে আরও জানুন।
বাডি সিস্টেম: ExoPlayer-এর সাথে কম্পোনেন্ট শেয়ার করা কেন প্রয়োজন?
DefaultPreloadManager এবং ExoPlayer একসাথে কাজ করার জন্য ডিজাইন করা হয়েছে। স্থায়িত্ব ও কার্যকারিতা নিশ্চিত করতে, তাদের অবশ্যই একাধিক মূল কম্পোনেন্ট শেয়ার করতে হবে। এগুলি আলাদা, অসংলগ্ন কম্পোনেন্ট হিসেবে কাজ করলে, তা থ্রেডের নিরাপত্তা এবং প্লেয়ারে প্রিলোড করা ট্র্যাকের ব্যবহারযোগ্যতার উপর প্রভাব ফেলতে পারে, কারণ আমাদের নিশ্চিত করতে হবে যে প্রিলোড করা ট্র্যাক যেন সঠিক প্লেয়ারে চালানো হয়। আলাদা আলাদা কম্পোনেন্ট নেটওয়ার্ক ব্যান্ডউইথ ও মেমরির মতো সীমিত রিসোর্সের জন্য একে অপরের সাথে প্রতিযোগিতা করতে পারে, যার ফলে পারফর্ম্যান্স খারাপ হতে পারে। লাইফসাইকেলের একটি গুরুত্বপূর্ণ অংশ হল উপযুক্ত ডিসপোজাল ম্যানেজ করা, ডিসপোজালের সাজেস্ট করা ক্রম হল প্রথমে PreloadManager রিলিজ করা, তারপরে ExoPlayer রিলিজ করা।
DefaultPreloadManager.Builder এই শেয়ারিংয়ের সুবিধা দেওয়ার জন্য ডিজাইন করা হয়েছে এবং এতে আপনার PreloadManager ও লিঙ্ক করা প্লেয়ার ইনস্ট্যান্স, দুটিরই ইনস্ট্যান্টিয়েশন করার জন্য API আছে। BandwidthMeter, LoadControl, TrackSelector, Looper-এর মতো কম্পোনেন্ট কেন শেয়ার করতে হবে তা দেখা যাক। ExoPlayer প্লেব্যাকের সাথে এইসব কম্পোনেন্ট কীভাবে ইন্টার্যাক্ট করে তার ভিজ্যুয়াল উপস্থাপনা চেক করুন।
শেয়ার করা BandwidthMeter-এর মাধ্যমে ব্যান্ডউইথ সংক্রান্ত সমস্যা প্রতিরোধ করা
BandwidthMeter, ট্রান্সফারের ঐতিহাসিক হারের উপর ভিত্তি করে উপলভ্য নেটওয়ার্ক ব্যান্ডউইথের একটি অনুমান প্রদান করে। PreloadManager এবং প্লেয়ার আলাদা ইনস্ট্যান্স ব্যবহার করলে, তারা একে অপরের নেটওয়ার্ক অ্যাক্টিভিটি সম্পর্কে জানতে পারে না, যার ফলে সমস্যা হতে পারে। যেমন, এমন একটি পরিস্থিতি বিবেচনা করুন যেখানে একজন ব্যবহারকারী একটি ভিডিও দেখছেন, তার নেটওয়ার্ক কানেকশন খারাপ হয়ে গেছে এবং প্রি-লোডিং MediaSource একই সাথে ভবিষ্যতের ভিডিওর জন্য একটি অ্যাগ্রেসিভ ডাউনলোড শুরু করে। প্রি-লোডিং MediaSource-এর অ্যাক্টিভিটি অ্যাক্টিভ প্লেয়ারের জন্য প্রয়োজনীয় ব্যান্ডউইথ ব্যবহার করবে, যার ফলে বর্তমান ভিডিওটি থেমে যাবে। প্লেব্যাক চলাকালীন স্টল হওয়া ব্যবহারকারীর অভিজ্ঞতার ক্ষেত্রে একটি উল্লেখযোগ্য ব্যর্থতা।
একটি BandwidthMeter শেয়ার করার মাধ্যমে, TrackSelector বর্তমান নেটওয়ার্কের অবস্থা এবং বাফারের অবস্থা অনুযায়ী প্রিলোডিং বা প্লেব্যাকের সময় সবচেয়ে ভালো কোয়ালিটির ট্র্যাক বেছে নিতে পারে। এটি তখন অ্যাক্টিভ প্লেব্যাক সেশন সুরক্ষিত করতে এবং একটি মসৃণ অভিজ্ঞতা নিশ্চিত করতে বুদ্ধিমান সিদ্ধান্ত নিতে পারে।
preloadManagerBuilder.setBandwidthMeter(customBandwidthMeter)
ExoPlayer-এর শেয়ার করা LoadControl, TrackSelector, Renderer কম্পোনেন্টের সাথে সামঞ্জস্য নিশ্চিত করা
- LoadControl: এই কম্পোনেন্ট বাফারিং সংক্রান্ত নীতি নির্ধারণ করে, যেমন প্লেব্যাক শুরু করার আগে কতটা ডেটা বাফার করতে হবে এবং কখন আরও ডেটা লোড করা শুরু বা বন্ধ করতে হবে। LoadControl শেয়ার করার মাধ্যমে এটি নিশ্চিত করা হয় যে প্লেয়ার ও PreloadManager-এর মেমরি ব্যবহার, প্রি-লোড করা ও অ্যাক্টিভভাবে চলা মিডিয়া, দুটির ক্ষেত্রেই একটি একক, সমন্বিত বাফারিং স্ট্র্যাটেজি দ্বারা পরিচালিত হয়, যার ফলে রিসোর্স নিয়ে কোনও দ্বন্দ্ব হয় না। ধারাবাহিকতা বজায় রাখতে, আপনি কতগুলি আইটেম প্রিলোড করছেন এবং কত সময়ের জন্য করছেন তার সাথে সামঞ্জস্য রেখে আপনাকে বাফারের সাইজ স্মার্টভাবে বরাদ্দ করতে হবে। কোনও সমস্যা হলে, প্লেয়ার স্ক্রিনে দেখানো বর্তমান আইটেমটি প্লেব্যাক করার ক্ষেত্রে অগ্রাধিকার দেবে। শেয়ার করা LoadControl-এর মাধ্যমে, প্রিলোডিংয়ের জন্য বরাদ্দ করা টার্গেট বাফার বাইট সর্বোচ্চ সীমায় না পৌঁছানো পর্যন্ত প্রিলোড ম্যানেজার প্রিলোড করা চালিয়ে যাবে, প্লেব্যাকের জন্য লোডিং সম্পূর্ণ না হওয়া পর্যন্ত এটি অপেক্ষা করে না।
মনে রাখবেন: Media3 (1.8)-এর লেটেস্ট ভার্সনে LoadControl শেয়ার করার মাধ্যমে নিশ্চিত করা হয় যে এর Allocator, PreloadManager ও প্লেয়ারের সাথে সঠিকভাবে শেয়ার করা যাবে। LoadControl ব্যবহার করে প্রি-লোডিং কার্যকরভাবে কন্ট্রোল করার ফিচারটি আসন্ন Media3 1.9 রিলিজে উপলভ্য হবে।
preloadManagerBuilder.setLoadControl(customLoadControl)
- TrackSelector: এই কম্পোনেন্ট কোন ট্র্যাক (যেমন, নির্দিষ্ট রেজোলিউশনের ভিডিও, নির্দিষ্ট ভাষার অডিও) লোড ও প্লে করা হবে তা বেছে নেয়। শেয়ার করার মাধ্যমে এটি নিশ্চিত করা হয় যে প্রিলোড করার সময় বেছে নেওয়া ট্র্যাকগুলিই প্লেয়ার ব্যবহার করবে। এর ফলে, ৪৮০p ভিডিও ট্র্যাক প্রি-লোড করার পরে প্লেয়ার সেটি বাতিল করে প্লেব্যাকের সময় ৭২০p ট্র্যাক নিয়ে আসার মতো অপ্রয়োজনীয় পরিস্থিতি এড়ানো যায়।< br /> প্রি-লোড ম্যানেজারকে প্লেয়ারের সাথে TrackSelector-এর একই ইনস্ট্যান্স শেয়ার করা উচিত নয়। পরিবর্তে, তাদের আলাদা TrackSelector ইনস্ট্যান্স ব্যবহার করা উচিত, তবে একই ইমপ্লিমেন্টেশনের। সেই জন্য আমরা DefaultPreloadManager.Builder-এ TrackSelector-এর পরিবর্তে TrackSelectorFactory সেট করি।
preloadManagerBuilder.setTrackSelectorFactory(customTrackSelectorFactory)
- রেন্ডারার: এই কম্পোনেন্ট সম্পূর্ণ রেন্ডারার তৈরি না করেই প্লেয়ারের ক্ষমতা বোঝার জন্য দায়ী। এটি এই ব্লুপ্রিন্ট চেক করে দেখে যে ফাইনাল প্লেয়ারে কোন ভিডিও, অডিও এবং টেক্সট ফর্ম্যাট কাজ করবে। এটি শুধুমাত্র মানানসই মিডিয়া ট্র্যাক বেছে নিতে ও ডাউনলোড করতে সাহায্য করে এবং প্লেয়ার চালাতে পারবে না এমন কন্টেন্টের জন্য ব্যান্ডউইথ নষ্ট হওয়া আটকায়।
preloadManagerBuilder.setRenderersFactory(customRenderersFactory)
আরও Exoplayer কম্পোনেন্ট সম্পর্কে পড়ুন।
সুবর্ণ নিয়ম: একটি সাধারণ প্লেব্যাক লুপার যা সবকটি লুপারকে নিয়ন্ত্রণ করে
প্লেয়ার তৈরি করার সময় Looper পাস করার মাধ্যমে ExoPlayer ইনস্ট্যান্স অ্যাক্সেস করা যায় এমন থ্রেড স্পষ্টভাবে নির্দিষ্ট করা যেতে পারে। Player.getApplicationLooper ব্যবহার করে, যে থ্রেড থেকে প্লেয়ার অ্যাক্সেস করতে হবে তার Looper কোয়েরি করা যেতে পারে। প্লেয়ার ও PreloadManager-এর মধ্যে শেয়ার করা Looper বজায় রাখার মাধ্যমে, এটি নিশ্চিত করা হয় যে এইসব শেয়ার করা মিডিয়া অবজেক্টের সব অপারেশন একটি সিঙ্গল থ্রেডের মেসেজ সারিতে সিরিয়ালাইজ করা হয়। এটি কনকারেন্সি বাগ কমাতে পারে।
PreloadManager এবং প্লেয়ারের মধ্যে লোড বা প্রিলোড করার জন্য মিডিয়া সোর্স সহ সব ইন্টার্যাকশন একই প্লেব্যাক থ্রেডে হতে হবে। থ্রেড সুরক্ষিত রাখতে Looper শেয়ার করা আবশ্যক এবং তাই PreloadManager ও প্লেয়ারের মধ্যে PlaybackLooper শেয়ার করতে হবে।
PreloadManager ব্যাকগ্রাউন্ডে একটি স্টেটফুল MediaSource অবজেক্ট প্রস্তুত করে। আপনার UI কোড player.setMediaSource(mediaSource) কল করলে, আপনি প্রিলোডিং MediaSource থেকে প্লেয়ারে এই জটিল, স্টেটফুল অবজেক্টের হ্যান্ডঅফ পারফর্ম করছেন। এই পরিস্থিতিতে, সম্পূর্ণ PreloadMediaSource ম্যানেজার থেকে প্লেয়ারে সরানো হয়। এইসব ইন্টার্যাকশন ও হ্যান্ডঅফ একই PlaybackLooper-এ হতে হবে।
PreloadManager এবং ExoPlayer আলাদা থ্রেডে কাজ করলে, রেস কন্ডিশন হতে পারে। PreloadManager-এর থ্রেড MediaSource-এর ইন্টার্নাল স্টেট (যেমন, বাফারে নতুন ডেটা লেখা) ঠিক সেই মুহূর্তে পরিবর্তন করতে পারে যখন প্লেয়ারের থ্রেড সেটি থেকে পড়ার চেষ্টা করছে। এর ফলে অপ্রত্যাশিত আচরণ, IllegalStateException হয় যা ডিবাগ করা কঠিন।
preloadManagerBuilder.setPreloadLooper(playbackLooper)
আসুন দেখে নেওয়া যাক, সেট-আপের মধ্যেই ExoPlayer এবং DefaultPreloadManager-এর মধ্যে উপরের সব কম্পোনেন্ট কীভাবে শেয়ার করতে পারবেন।
val preloadManagerBuilder =
DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
// Optional - Share components between ExoPlayer and DefaultPreloadManager
preloadManagerBuilder
.setBandwidthMeter(customBandwidthMeter)
.setLoadControl(customLoadControl)
.setMediaSourceFactory(customMediaSourceFactory)
.setTrackSelectorFactory(customTrackSelectorFactory)
.setRenderersFactory(customRenderersFactory)
.setPreloadLooper(playbackLooper)
val preloadManager = val preloadManagerBuilder.build()পরামর্শ: আপনি যদি ExoPlayer-এ ডিফল্ট কম্পোনেন্ট ব্যবহার করেন, যেমন DefaultLoadControl ইত্যাদি, তাহলে আপনাকে সেগুলি আলাদাভাবে DefaultPreloadManager-এর সাথে শেয়ার করতে হবে না। আপনি যদি ডিফল্ট কনফিগারেশনের সাথে ডিফল্ট ইমপ্লিমেন্টেশন ব্যবহার করেন, তাহলে DefaultPreloadManager.Builder-এর buildExoPlayer-এর মাধ্যমে ExoPlayer ইনস্ট্যান্স তৈরি করার সময় এইসব কম্পোনেন্ট অটোমেটিক একে অপরের সাথে রেফারেন্স করা হয়। তবে, আপনি কাস্টম কম্পোনেন্ট বা কাস্টম কনফিগারেশন ব্যবহার করলে, আপনাকে উপরে উল্লেখ করা API-এর মাধ্যমে DefaultPreloadManager-কে তাদের সম্পর্কে স্পষ্টভাবে জানাতে হবে।
প্রোডাকশন-রেডি প্রিলোডিং: স্লাইডিং উইন্ডো প্যাটার্ন
ডায়নামিক ফিডে, ব্যবহারকারী কার্যত অসীম পরিমাণ কন্টেন্ট স্ক্রল করে দেখতে পারেন। আপনি যদি সংশ্লিষ্ট সরানোর স্ট্র্যাটেজি ছাড়াই DefaultPreloadManager-এ ক্রমাগত ভিডিও যোগ করতে থাকেন, তাহলে আপনি অনিবার্যভাবে OutOfMemoryError-এর কারণ হবেন। প্রতিটি প্রি-লোড করা MediaSource একটি SampleQueue-এর সাথে যুক্ত থাকে, যা মেমরি বাফার বরাদ্দ করে। এগুলি জমা হতে থাকলে, অ্যাপ্লিকেশনের হিপ স্পেস শেষ হয়ে যেতে পারে। সমাধানটি হল একটি অ্যালগরিদম যার সাথে আপনি ইতিমধ্যেই পরিচিত হতে পারেন, যাকে স্লাইডিং উইন্ডো বলা হয়। স্লাইডিং উইন্ডো প্যাটার্ন মেমরিতে আইটেমের একটি ছোট, ম্যানেজ করা যায় এমন সেট বজায় রাখে যা ফিডে ব্যবহারকারীর বর্তমান অবস্থানের সাথে যৌক্তিকভাবে সংলগ্ন। ব্যবহারকারী স্ক্রল করার সাথে সাথে, ম্যানেজ করা আইটেমের এই "উইন্ডো" তাদের সাথে স্লাইড করে, ভিউতে আসা নতুন আইটেম যোগ করে এবং এখন দূরে থাকা আইটেমগুলিও সরিয়ে দেয়।
স্লাইডিং উইন্ডো প্যাটার্ন প্রয়োগ করা
এটি বোঝা গুরুত্বপূর্ণ যে PreloadManager-এ কোনও বিল্ট-ইন setWindowSize() পদ্ধতি নেই। স্লাইডিং উইন্ডো হল একটি ডিজাইন প্যাটার্ন যা আপনি, ডেভেলপার, প্রিমিটিভ add() এবং remove() পদ্ধতি ব্যবহার করে বাস্তবায়নের জন্য দায়ী। আপনার অ্যাপ্লিকেশন লজিককে অবশ্যই UI ইভেন্ট, যেমন স্ক্রল বা পৃষ্ঠা পরিবর্তন, এই API কলের সাথে কানেক্ট করতে হবে। আপনি যদি এর জন্য একটি কোড রেফারেন্স চান, তাহলে আমাদের কাছে এই স্লাইডিং উইন্ডো প্যাটার্নটি socialite স্যাম্পেলে প্রয়োগ করা আছে যার মধ্যে একটি PreloadManagerWrapper রয়েছে যা একটি স্লাইডিং উইন্ডোকে অনুকরণ করে।
ব্যবহারকারী শীঘ্রই আইটেমটি আর দেখতে পাবেন না বলে মনে হলে, আপনার ইমপ্লিমেন্টেশনে preloadManager.remove(mediaItem) যোগ করতে ভুলবেন না। ব্যবহারকারীর কাছাকাছি আর নেই এমন আইটেম সরাতে না পারা হল প্রিলোডিং ইমপ্লিমেন্টেশনে মেমরি সমস্যার প্রাথমিক কারণ। remove() কল নিশ্চিত করে যে রিসোর্স রিলিজ করা হয়েছে যা আপনার অ্যাপের মেমরির ব্যবহার সীমিত ও স্থিতিশীল রাখতে সাহায্য করে।
TargetPreloadStatusControl-এর মাধ্যমে ক্যাটেগরি অনুযায়ী প্রিলোডিং স্ট্র্যাটেজি ফাইন-টিউন করা
এখন আমরা কী প্রি-লোড করতে হবে (আমাদের উইন্ডোতে থাকা আইটেম) তা নির্ধারণ করেছি, আমরা প্রতিটি আইটেমের জন্য কতটা প্রি-লোড করতে হবে তার জন্য একটি সুনির্দিষ্ট স্ট্র্যাটেজি প্রয়োগ করতে পারি। পার্ট ১-এ TargetPreloadStatusControl সেট-আপের মাধ্যমে কীভাবে এই গ্র্যানুলারিটি অর্জন করা যায় তা আমরা আগেই দেখেছি।
মনে রাখবেন, +/- ১ পজিশনে থাকা আইটেম +/- ৪ পজিশনে থাকা আইটেমের চেয়ে বেশিবার চালানোর সম্ভাবনা থাকে। ব্যবহারকারী এর পরে যে আইটেমটি দেখতে পারেন, সেটির জন্য আপনি আরও রিসোর্স (নেটওয়ার্ক, CPU, মেমরি) বরাদ্দ করতে পারেন। এটি প্রক্সিমিটির উপর ভিত্তি করে "প্রি-লোডিং" স্ট্র্যাটেজি তৈরি করে, যা রিসোর্সের দক্ষ ব্যবহারের সাথে সাথে অবিলম্বে প্লেব্যাক ব্যালেন্স করার মূল চাবিকাঠি।
আপনার প্রিলোড করার সময়সীমা সংক্রান্ত স্ট্র্যাটেজি নির্ধারণ করতে, আগের বিভাগে আলোচনা করা PreloadManagerListener-এর মাধ্যমে অ্যানালিটিক্স ডেটা ব্যবহার করতে পারেন।
উপসংহার ও পরবর্তী ধাপ
Media3-এর DefaultPreloadManager ব্যবহার করে দ্রুত, স্থিতিশীল এবং রিসোর্স-দক্ষ মিডিয়া ফিড তৈরি করার জন্য আপনি এখন উন্নত জ্ঞান অর্জন করেছেন।
গুরুত্বপূর্ণ বিষয়গুলি আরেকবার দেখে নেওয়া যাক:
- অ্যানালিটিক্স ইনসাইট সংগ্রহ করতে এবং শক্তিশালী সমস্যা ম্যানেজমেন্ট প্রয়োগ করতে PreloadManagerListener ব্যবহার করুন।
- গুরুত্বপূর্ণ কম্পোনেন্ট শেয়ার করা হয়েছে কিনা তা নিশ্চিত করতে, আপনার ম্যানেজার ও প্লেয়ার ইনস্ট্যান্স তৈরি করার জন্য সবসময় একটি DefaultPreloadManager.Builder ব্যবহার করুন।
- OutOfMemoryError প্রতিরোধ করতে add() এবং remove() কলগুলি সক্রিয়ভাবে ম্যানেজ করে স্লাইডিং উইন্ডো প্যাটার্ন প্রয়োগ করুন।
- পারফর্ম্যান্স ও রিসোর্স ব্যবহারের মধ্যে ভারসাম্য বজায় রাখে এমন স্মার্ট, টায়ার করা প্রিলোডিং স্ট্র্যাটেজি তৈরি করতে TargetPreloadStatusControl ব্যবহার করুন।
পার্ট ৩-এ এর পরে কী আছে: প্রিলোড করা মিডিয়া সহ ক্যাশিং
মেমরিতে ডেটা প্রিলোড করলে পারফর্ম্যান্সের ক্ষেত্রে তাৎক্ষণিক সুবিধা পাওয়া যায়, তবে এর কিছু নেতিবাচক দিকও থাকতে পারে। অ্যাপ্লিকেশন বন্ধ হয়ে গেলে বা ম্যানেজার থেকে প্রি-লোড করা মিডিয়া সরিয়ে দেওয়া হলে, ডেটা মুছে যায়। আরও স্থায়ী লেভেলের অপ্টিমাইজেশন পেতে, আমরা ডিস্ক ক্যাশিংয়ের সাথে প্রিলোডিং একত্রিত করতে পারি। এই ফিচারটি বর্তমানে ডেভেলপ করা হচ্ছে এবং আগামী কয়েক মাসের মধ্যে এটি উপলভ্য হবে।
আপনার কি কোনও মতামত শেয়ার করার আছে? আমরা আপনার মতামত জানার জন্য অধীর আগ্রহে অপেক্ষা করছি।
সাথে থাকুন এবং আপনার ভিডিও প্লেব্যাক আরও দ্রুত করুন! 🚀
-
প্রোডাক্ট সংক্রান্ত খবরআজকের মিডিয়া-কেন্দ্রিক অ্যাপে, মসৃণ, নিরবচ্ছিন্ন প্লেব্যাকের অভিজ্ঞতা প্রদান করা হল ব্যবহারকারীর আনন্দদায়ক অভিজ্ঞতার চাবিকাঠি। ব্যবহারকারীরা আশা করেন যে তাদের ভিডিওগুলি অবিলম্বে শুরু হবে এবং বিরতি ছাড়াই নির্বিঘ্নে চলবে।
Mayuri Khinvasara Khabya • ৮ মিনিট লাগবে -
প্রোডাক্ট সংক্রান্ত খবরএজেন্টিক ডেভেলপমেন্টের গতি বাড়ার সাথে সাথে, Android ইঞ্জিনিয়ারিং একটি নতুন দিগন্তে পৌঁছে যাচ্ছে: সহায়ক কোড সম্পূর্ণ করা থেকে শুরু করে আপনার নির্দেশনায় এন্ড-টু-এন্ড কাজ করা এজেন্ট পর্যন্ত। আপনি যে মডেল ও এজেন্ট ব্যবহার করেন, তার উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ ও নমনীয়তা থাকে।
Jason Buchel • ৩ মিনিট রিডিং -
প্রোডাক্ট সংক্রান্ত খবরআজ আমরা শেয়ার করেছি যে কীভাবে আমরা আমাদের "স্টোরের চেয়েও বেশি কিছু" ভিশনকে পরবর্তী অধ্যায়ে নিয়ে যাচ্ছি। 'অ্যাকাউন্ট' ট্যাব থেকে, এখন ২৫০ মিলিয়নেরও বেশি মাসিক অ্যাক্টিভ ব্যবহারকারীর জন্য ব্যক্তিগত হোম বেস, আমাদের ইউনিফায়েড গেমিং প্ল্যাটফর্ম ৭০০ মিলিয়নেরও বেশি গেমার প্রোফাইলকে কানেক্ট করছে, Google Play ব্যবহারকারীদের যেখানেই থাকুক না কেন তাদের সাথে কানেক্ট করছে।
Paul Feng • ৩ মিনিট রিডিং
আপনার ইনবক্সে প্রতি সপ্তাহে Android ডেভেলপমেন্ট সংক্রান্ত লেটেস্ট ইনসাইট পান।