ডেটা লোড করার সময় যদি আপনার অ্যান্ড্রয়েড অ্যাপটি কখনো ফ্রিজ হয়ে যায় অথবা আপনার অ্যাসিঙ্ক্রোনাস কোড কলব্যাকের গোলকধাঁধায় পরিণত হয়, তাহলে আপনার কোটলিন কো-রুটিন আয়ত্ত করা প্রয়োজন। মূলত, এই টুলগুলো আমাদের এমন প্রসেস লিখতে সাহায্য করে যা মেইন থ্রেডকে ব্লক করে না, যার ফলে... ব্যবহারকারী ইন্টারফেস সাবলীল থাকে যখন আমরা নেপথ্যে কঠোর পরিশ্রম করে যাই।
এটাকে নিখুঁতভাবে কাজ করানোর কৌশল শুধু এলোমেলোভাবে কো-রুটিন ব্যবহার করা নয়, বরং সঠিকভাবে জানা। যেখানে তাদের মৃত্যুদণ্ড কার্যকর করা হয়এইখানেই ডিসপ্যাচারদের ভূমিকা শুরু হয়, যারা অর্কেস্ট্রা কন্ডাক্টরের মতো কাজ করে এবং সিপিইউ-এর উপর অতিরিক্ত চাপ বা স্ক্রিন ফ্রিজ হওয়া এড়াতে কোন থ্রেড কোন কাজটি করবে তা নির্ধারণ করে।
মৃত্যুদণ্ডের স্তম্ভ: প্রেরকগণ
En Kotlinআমরা হুট করে একটি কো-রুটিন তৈরি করে ফেলতে পারি না; এটির জন্য সবসময় একটি ডিসপ্যাচার প্রয়োজন হয়। প্রেরণকারী। প্রধান ব্যবহারকারী যা কিছু দেখেন, তার সবকিছুর জন্যই এটি দায়ী। এটি শুধুমাত্র UI-এর সাথে ইন্টারঅ্যাক্ট করতে, লাইভ ডেটা আপডেট করতে, বা দ্রুত ফাংশন চালু করতে ব্যবহৃত হয়। আপনি যদি এখানে কোনো জটিল গণনা করার চেষ্টা করেন, তাহলে অ্যাপটি অনিবার্যভাবে ধীর হয়ে যাবে।
যেসব কাজে ফাইল পড়া, Room ডেটাবেসে লেখা, বা HTTP অনুরোধ করার প্রয়োজন হয়, সেগুলোর জন্য আমাদের কাছে রয়েছে ডিসপ্যাচারস.আইওএটি ইনপুট/আউটপুট টাস্কের জন্য অপ্টিমাইজ করা হয়েছে, যেখানে থ্রেড একটি বাহ্যিক প্রতিক্রিয়ার জন্য অপেক্ষা করতে অনেক সময় ব্যয় করে। তাই, এই ডিসপ্যাচারটি ৬৪টি থ্রেড পর্যন্ত স্কেল করতে পারে, কারণ এটি সিপিইউ-এর উপর অতিরিক্ত চাপ সৃষ্টি করে না। অপেক্ষা করার সময়।
যখন সমস্যাটি কম্পিউটিং শক্তি সংক্রান্ত হয়, যেমন একটি বিশাল JSON ফাইল প্রসেস করা বা একটি বিরাট তালিকা সাজানো, তখন ডিসপ্যাচার। ডিফল্ট এটাই সঠিক বিকল্প। IO বিকল্পটির মতো নয়, এটি মানানসই। ভৌত নিউক্লিয়াসের সংখ্যা আপনার প্রসেসরের। আপনার যদি মাত্র চারটি কোর থাকে, তবে একশটি থ্রেড তৈরি করার কোনো মানে হয় না, কারণ এতে সিস্টেমটি কনটেক্সট পরিবর্তন করতে গিয়ে মূল্যবান সময় নষ্ট করবে।
এছাড়াও আছে প্রেরকগণ।অসীমাবদ্ধযদিও বাস্তব-জগতের প্রজেক্টগুলিতে এটি খুব কমই দেখা যায়, এটি যে থ্রেড থেকে কল করা হয় সেখানেই তার এক্সিকিউশন শুরু করে এবং তারপর সাসপেন্ড করা ফাংশনটি যেখানে শেষ হয়েছিল সেখান থেকে আবার শুরু করে, তাই প্রস্তাবিত নয় যদি না আপনি ঠিক জানেন যে আপনি কী করছেন।
withContext এবং Main Thread Security ব্যবহার করে এক্সিকিউশন নিয়ন্ত্রণ
অ্যান্ড্রয়েডের অন্যতম সেরা অনুশীলন হলো সমস্ত বৈশিষ্ট্য তৈরি করা মূল থ্রেডের জন্য নিরাপদএটি অর্জন করা হয় ব্যবহার করে withContext()ফাংশনটি কোন থ্রেডে চালাতে হবে তা কলারকে জানতে বাধ্য করার পরিবর্তে, ফাংশনটি নিজেই কনটেক্সট পরিবর্তনের কাজটি করে থাকে।
আমরা যখন ব্যবহার করি withContext(Dispatchers.IO)কো-রুটিনটিকে বর্তমান থ্রেডে স্থগিত করে, প্রয়োজনীয় কাজটি করার জন্য I/O পুলে স্থানান্তর করা হয়, এবং একবার কাজটি শেষ হয়ে গেলে, ফলাফল ফেরত দেয় মূল থ্রেডে। এর সবচেয়ে ভালো দিক হলো, এটি পুরোনো কলব্যাকগুলোর তুলনায় কোনো অতিরিক্ত পারফরম্যান্স ওভারহেড যোগ করে না এবং আপনাকে এমন কোড লেখার সুযোগ দেয় যা দেখতে লিনিয়ার মনে হলেও আসলে অ্যাসিঙ্ক্রোনাস।
এটা বোঝা অপরিহার্য যে একটি ফাংশনকে চিহ্নিত করা suspend এর মানে এই নয় যে এটি স্বয়ংক্রিয়ভাবে একটি সেকেন্ডারি থ্রেডে চলে। একটি সাসপেন্ডেড ফাংশন মেইন থ্রেডেও খুব ভালোভাবে চলতে পারে; এটি যা করে তা হলো... স্থগিত কার্য সম্পাদন থ্রেডকে ব্লক না করে, পরবর্তীতে পুনরায় চালু করার জন্য স্টেটটি স্ট্যাক ফ্রেমে সংরক্ষণ করা।
জীবনচক্র ব্যবস্থাপনা: পরিধি এবং কাজ
বেশিরভাগ ক্ষেত্রেই GlobalScope দিয়ে কো-রুটিন চালু করা একটি বড় ভুল, কারণ এটি পরীক্ষা করা খুব কঠিন এবং এর ফলে মেমোরি লিক হতে পারে। আদর্শগতভাবে, আপনার ব্যবহার করা উচিত... জীবনচক্রের সাথে যুক্ত পরিধিঅ্যান্ড্রয়েডে, আমাদের আছে viewModelScope ViewModel এবং এর জন্য lifecycleScope কার্যকলাপ বা খণ্ডাংশগুলির জন্য।
যখন একটি অ্যাক্টিভিটি ধ্বংস হয়ে যায়, তখন এর lifecycleScope এটি স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায়, যার ফলে সমস্ত দুর্নীতিমূলক কার্যকলাপ বন্ধ করে দেয় সেই এলাকায় সক্রিয়। এটি অ্যাপটিকে এমন একটি ইন্টারফেস আপডেট করার চেষ্টা করা থেকে বিরত রাখে যার আর অস্তিত্ব নেই, ফলে অনুপস্থিত রেফারেন্সের কারণে হওয়া সাধারণ ক্র্যাশ প্রতিরোধ করে।
আমরা যখনই ব্যবহার করি launch o async, আমরা একটি পেতে কাজের বস্তুএই কাজটি একটি রিমোট কন্ট্রোলের মতো, যা দিয়ে আমরা কো-রুটিন নিয়ন্ত্রণ করতে পারি। আমরা ব্যবহার করতে পারি job.cancel() কাজটি বাতিল করতে অথবা job.join() পরবর্তী কো-রুটিনে যাওয়ার আগে যদি একটি কো-রুটিন শেষ হওয়ার জন্য অপেক্ষা করতে হয়।
সমকালীনতা এবং বাস্তব সমান্তরালতা
অনেকে কনকারেন্সি এবং প্যারালেলিজমকে গুলিয়ে ফেলেন। কনকারেন্সি অনেকটা একজন জাগলারের মতো, যিনি একসাথে অনেকগুলো বল সামলান; দেখে মনে হয় যেন সবগুলো একসাথে উড়ছে, কিন্তু তিনি একবারে কেবল একটি বলই স্পর্শ করেন। বাস্তব সমান্তরালতা এটি তখন ঘটে যখন একাধিক সিপিইউ কোর একই সাথে বিভিন্ন কাজে নিযুক্ত থাকে।
এটি অর্জন করতে, আমরা কনস্ট্রাক্টর ব্যবহার করি। asyncযা আমাদের ফিরিয়ে দেয় Deferredযদি আমরা দুটি টাস্ক চালু করি async(Dispatchers.Default) একটি মাল্টি-কোর মোবাইল ডিভাইসে, উভয়ই চলবে ঠিক একই সময়েমানগুলো পুনরুদ্ধার করতে আমরা কেবল কল করি await().
যদি আমরা একাধিক টাস্ক চালু করতে চাই এবং পরবর্তী টাস্কে যাওয়ার আগে সেগুলোর সবগুলো শেষ হওয়া নিশ্চিত করতে চাই, তাহলে সবচেয়ে পরিচ্ছন্ন উপায় হলো ব্যবহার করা। coroutineScope { ... }এটি এমন একটি পরিবেশ তৈরি করে কাঠামোগত সমান্তরালতা যেখানে, যদি কোনো একটি চাইল্ড টাস্ক ব্যর্থ হয়, তাহলে স্কোপটি ত্রুটিটি সামাল দেয় এবং এক্সেপশনগুলোকে নীরবে পার হয়ে যাওয়া থেকে প্রতিরোধ করে, যা ঘটতে পারত যদি আমরা ব্যবহার করতাম async তাকে ছাড়া await সেই অনুযায়ী।
প্রসঙ্গ পরিবর্তনের গঠন
প্রসঙ্গের পরিবর্তন বা প্রসঙ্গ পরিবর্তন এটি এমন একটি প্রক্রিয়া যেখানে অপারেটিং সিস্টেম একটি থ্রেডকে থামিয়ে তার অবস্থা সংরক্ষণ করে এবং অন্য একটি থ্রেড লোড করে। যদিও কো-রুটিনগুলো হালকা, তবুও এদের মধ্যে স্যুইচ করা... Dispatchers.Default y Dispatchers.IO এর জন্য বিভিন্ন থ্রেড পুলের মধ্যে এক্সিকিউশন স্থানান্তর করতে হয়।
অতিরিক্ত কনটেক্সট সুইচ ব্যবহার করলে পারফরম্যান্স ক্ষতিগ্রস্ত হতে পারে। তবে, কোটলিন ফ্রেমওয়ার্কটি খুবই বুদ্ধিমান এবং জাম্প অপ্টিমাইজ করেআপনি যদি ইতিমধ্যেই একটি সামঞ্জস্যপূর্ণ থ্রেড পুলে থাকেন, তাহলে সিপিইউ রেজিস্টার সংরক্ষণ ও লোড করার অপ্রয়োজনীয় ওভারহেড এড়ানোর জন্য সিস্টেম আপনাকে একই থ্রেডে রাখার চেষ্টা করবে।
গুরুত্বপূর্ণ দ্রষ্টব্য: থ্রেড পুল ব্যবহার করলেই যে একটি কো-রুটিন শুরু থেকে শেষ পর্যন্ত সর্বদা একই থ্রেডে চলবে, তার কোনো নিশ্চয়তা নেই। suspend এবং একটি resumeএটা সম্ভব যে কো-রুটিন অন্য একটি থ্রেডে জেগে উঠুনতাই, লোকাল থ্রেড ভেরিয়েবলের (ThreadLocal) উপর নির্ভর করা ঝুঁকিপূর্ণ হতে পারে।
অ্যাসিঙ্ক্রোনাস ওয়ার্কফ্লোতে দক্ষতা অর্জনের জন্য, আদর্শ পদ্ধতি হলো উপযুক্ত স্কোপ ব্যবহার করে মেইন থ্রেডে কো-রুটিনটি চালু করা এবং কঠিন কাজগুলো অর্পণ করা। Dispatchers.IO o Default ব্যবহার withContextএবং এর শক্তিকে কাজে লাগান async যখন আমাদের সমান্তরালভাবে ফলাফল প্রয়োজন, যাতে অ্যাপ্লিকেশনটি দ্রুতগতিতে চলে এবং ব্যবহারকারীর অভিজ্ঞতা ত্রুটিহীন হয়।
