কোটলিন কোরাউটিনের সম্পূর্ণ নির্দেশিকা: launch, async, এবং await-এ দক্ষতা অর্জন

  • রিটার্ন ছাড়া টাস্কের জন্য launch ব্যবহার এবং await ব্যবহার করে ফলাফল পাওয়ার জন্য async ব্যবহারের মধ্যে মৌলিক পার্থক্য।
  • ইউজার ইন্টারফেস ব্লক হওয়া এড়াতে Dispatchers.Main, IO, এবং Default ব্যবহার করে কার্যকর থ্রেড ব্যবস্থাপনা।
  • CoroutineScope এবং Job ব্যবহার করে কাঠামোগত সমান্তরালতা এবং জীবনচক্র নিয়ন্ত্রণের বাস্তবায়ন।

কোটলিন কোরাউটিন: launch, async এবং await-এ দক্ষতা অর্জন

কোনো কিছু ডাউনলোড করার সময় যদি আপনার অ্যান্ড্রয়েড অ্যাপটি কখনো থেমে যায় বা সাড়া দেওয়া বন্ধ করে দেয়, তাহলে সম্ভবত আপনি মেইন থ্রেড নিয়ে সমস্যায় পড়েছেন। মোবাইল ডেভেলপমেন্টের জগতে, কঠিন কাজ করার সময় অ্যাপটিকে মসৃণভাবে চালু রাখাটাই হলো পরম আকাঙ্ক্ষিত লক্ষ্য, এবং এখানেই কোটলিন কো-রুটিনের ভূমিকা আসে । এগুলি মূলত আমাদেরকে অন্তহীন কলব্যাকের জালে না জড়িয়ে অ্যাসিঙ্ক্রোনাস কোড লেখার সুযোগ করে দেয়।

কো-রুটিনগুলোকে হালকা থ্রেড হিসেবে ভাবুন ; এগুলো প্রতিবার একটি নতুন অপারেটিং সিস্টেম থ্রেড তৈরি করে না, বরং বিদ্যমান থ্রেডের সমষ্টি এবং একটি অত্যন্ত বুদ্ধিমান শিডিউলিং সিস্টেমকে কাজে লাগায়। এটি এদেরকে অবিশ্বাস্যভাবে দক্ষ করে তোলে, এবং কোড প্রায় ক্রমানুসারে পঠিত হয়, যদিও নেপথ্যে বিরতি ও পুনরায় চালুর এক জটিল প্রক্রিয়া চলতে থাকে , ফলে ব্যবহারকারী স্ক্রিনে কোনো ল্যাগ লক্ষ্য করেন না।

স্থগিত করার রহস্য: স্থগিত করুন এবং পুনরায় চালু করুন।

সাধারণ ফাংশনের থেকে ভিন্ন, কো-রুটিন দুটি গুরুত্বপূর্ণ ধারণা নিয়ে আসে। প্রথমত, `suspend` আছে , যা কোনো কাজের বর্তমান অবস্থা সংরক্ষণ করে তার নির্বাহকে থামিয়ে দেয়। দ্বিতীয়ত, `resume` আছে , যা কাজটি ঠিক যেখান থেকে থেমেছিল সেখান থেকেই আবার শুরু করে। মজার ব্যাপার হলো, একটি সাসপেন্ডেড ফাংশন যে থ্রেডে চলছে তাকে ব্লক করে না; এটি কেবল অন্য কাজগুলোকে এগিয়ে যাওয়ার সুযোগ দেওয়ার জন্য একপাশে সরে দাঁড়ায় এবং কোনো প্রতিক্রিয়ার জন্য অপেক্ষা করে, যেমন—ডাটাবেস থেকে।

এটা বোঝা অত্যন্ত জরুরি যে `suspend` কীওয়ার্ড ব্যবহার করলেই কোড স্বয়ংক্রিয়ভাবে একটি সেকেন্ডারি থ্রেডে চলে যায় না। মেইন- সেফটি নিশ্চিত করতে , আমাদের অবশ্যই এই ফাংশনগুলোকে উপযুক্ত ডিসপ্যাচারের সাথে যুক্ত করতে হবে, যাতে কোনো রিসোর্স-ইনটেনসিভ অপারেশন ইউজার ইন্টারফেসকে অচল করে না দেয়।

কোটলিন কোরাউটিন: launch, async এবং await-এ দক্ষতা অর্জন
সম্পর্কিত নিবন্ধ:
অ্যান্ড্রয়েড ডেভেলপারদের জন্য কোটলিনের সম্পূর্ণ নির্দেশিকা: ধারণা এবং মৌলিক বিষয়াবলী

ডিসপ্যাচার: জাদুটা কোথায় ঘটে?

কোডের প্রতিটি অংশ নির্বাহ করার জন্য কোন থ্রেড ব্যবহার করতে হবে, তা কোটলিনকে জানানোর জন্য আমরা ডিসপ্যাচার ব্যবহার করি । সব ডিসপ্যাচার একই কাজ করে না, তাই সঠিকটি কীভাবে বেছে নিতে হয় তা আপনার জানা প্রয়োজন।

  • প্রেরণকারী। প্রধানএই টুলটি ইউজার ইন্টারফেসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয়। এটি শুধুমাত্র দ্রুত ভিজ্যুয়াল পরিবর্তন বা লাইভডেটার সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহার করা উচিত, কারণ এখানে কোনো জটিল কাজ করলে এরর দেখা দেবে। অ্যাপ্লিকেশন সাড়া দিচ্ছে না (ANR).
  • ডিসপ্যাচারস.আইওএটি ইনপুট/আউটপুট কাজের জন্য বিশেষভাবে তৈরি। এটি এর জন্য একটি আদর্শ স্থান। এপিআই কলডিস্ক থেকে ফাইল পড়ুন অথবা রুম ডেটাবেস পরিচালনা করুন।
  • ডিসপ্যাচার। ডিফল্টসিপিইউ-এর উপর চাপ সৃষ্টিকারী কাজের জন্য ডিজাইন করা হয়েছে, যেমন যখন আপনার প্রয়োজন হয় একটি বিশাল JSON প্রক্রিয়া করুন অথবা আইটেমের একটি বিশাল তালিকা সাজাতে।

একটি খুব প্রচলিত এবং প্রস্তাবিত কৌশল হলো `withContext` ব্যবহার করা । এই ফাংশনটি আমাদেরকে কলব্যাকের প্রয়োজন ছাড়াই একটি সাসপেন্ডেড ফাংশনের মধ্যে ডিসপ্যাচার পরিবর্তন করার সুযোগ দেয়। এইভাবে, ফাংশনটি কলকারী ডেভেলপারকে এটি কোন থ্রেডে চলছে তা নিয়ে চিন্তা করতে হয় না, কারণ ফাংশনটি নিজেই অভ্যন্তরীণভাবে IO বা ডিফল্ট থ্রেডে স্যুইচ করে নিজের সুরক্ষা নিশ্চিত করে ।

লঞ্চ বনাম অ্যাসিঙ্ক: কোনটি বেছে নেবেন?

যখন আমরা একটি কো-রুটিন শুরু করতে চাই, তখন টাস্কটি থেকে কোনো কিছু রিটার্ন করার প্রয়োজন আছে কি না, তার উপর নির্ভর করে দুটি প্রধান পথ থাকে।

`launch` অপারেটরকে আমরা বলি "ফায়ার অ্যান্ড ফরগেট"। এটি এমন সব কাজের জন্য ব্যবহৃত হয় যেগুলোর কোনো ফলাফল থাকে না, যেমন স্ক্রিনের রঙ আপডেট করা বা ক্যাশে ডেটা সংরক্ষণ করা। এটি একটি `Job` অবজেক্ট রিটার্ন করে , যা মূলত একটি রিমোট কন্ট্রোলের মতো কাজ করে এবং এর মাধ্যমে আমরা কো-রুটিনটি আর প্রয়োজন না হলে বাতিল করে দিতে পারি।

অন্যদিকে, যখন আমাদের একটি রিটার্ন ভ্যালুর প্রয়োজন হয়, তখন `async` ব্যবহার করা হয়। এই অপারেটরটি একটি `Deferred<T>` রিটার্ন করে , যা ভবিষ্যতে একটি ফলাফল আসবে এমন একটি প্রতিশ্রুতির মতো। এই ভ্যালুটি পেতে, আমাদের `await()` ফাংশনটি কল করতে হয় , যা ফলাফল প্রস্তুত না হওয়া পর্যন্ত এক্সিকিউশন স্থগিত রাখে। `async`-এর একটি সুবিধা হলো এটি সমান্তরাল কল করার সুযোগ দেয় ; যদি আমরা তিনটি `async` রিকোয়েস্ট করি, তবে তিনটিই একই সময়ে সার্ভারে যাবে, যা মোট অপেক্ষার সময়কে অপ্টিমাইজ করে।

কাঠামোগত সমান্তরালতা এবং জীবনচক্র ব্যবস্থাপনা

ব্যবহারকারী স্ক্রিন বন্ধ করার পরেও কো-রুটিনগুলো যাতে চলতে না থাকে (যা মেমোরি লিকের কারণ হতে পারে), তা প্রতিরোধ করার জন্য কোটলিন স্ট্রাকচার্ড কনকারেন্সি ব্যবহার করে । এই পুরো বিষয়টি CoroutineScope- এর মাধ্যমে পরিচালিত হয় , যা এর মধ্যে চালু হওয়া সমস্ত কো-রুটিনকে ট্র্যাক করে।

অ্যান্ড্রয়েডে, `viewModelScope` বা `lifecycleScope`- এর মতো পূর্বনির্ধারিত স্কোপ ব্যবহার করাই সবচেয়ে প্রচলিত । এগুলো খুবই চমৎকার, কারণ যখন `ViewModel` ধ্বংস হয়ে যায় বা `Activity` শেষ হয়, তখন এগুলো স্বয়ংক্রিয়ভাবে সমস্ত চলমান কাজ বাতিল করে দেয়। আপনার যদি নিজের স্কোপ তৈরি করার প্রয়োজন হয়, তবে আপনি একটি `Job` এবং একটি `Dispatcher` একত্রিত করতে পারেন, কিন্তু সর্বদা মনে রাখবেন আপনার ক্লাসের ক্লিনআপ মেথডে ` scope.cancel()` কল করতে হবে।

ত্রুটি এবং বিশেষ পরিস্থিতি পরিচালনা করা

আপনি কোন কনস্ট্রাক্টর ব্যবহার করছেন তার উপর নির্ভর করে এক্সেপশন হ্যান্ডলিং ভিন্ন হয়। `launch`- এ , যদি কোনো ত্রুটি ঘটে এবং তা ধরা না হয়, তাহলে অ্যাপ্লিকেশনটি সাথে সাথে বন্ধ হয়ে যাবে। তবে, `async`- এ, এক্সেপশনটি `Deferred` অবজেক্টের মধ্যে সংরক্ষিত থাকে এবং ` await()` কল না করা পর্যন্ত তা থ্রো করা হয় না , যার ফলে সতর্ক না হলে অনেক সময় ত্রুটিগুলো অলক্ষিত থেকে যেতে পারে।

এটি স্বাভাবিকভাবে পরিচালনা করার জন্য, কলগুলোকে try-catch ব্লকের মধ্যে রাখাই সবচেয়ে ভালো , যা অ্যাসিঙ্ক্রোনাস কোডকে সিঙ্ক্রোনাস কোডের মতোই সহজবোধ্য করে তোলে। এছাড়াও, যদি আমরা চাই কোনো কো-রুটিন তার প্যারেন্ট দ্বারা বাতিল হওয়া থেকে সুরক্ষিত থাকুক, তাহলে আমরা `withContext`-এর সাথে `NonCancellable` ব্যবহার করতে পারি , যদিও কনকারেন্সি হায়ারার্কি যাতে ভেঙে না যায়, সেজন্য এটি খুব সাবধানে করা উচিত।

রেট্রোফিটের মতো লাইব্রেরির সাথে এই সবকিছুকে একীভূত করা খুবই সহজ, কারণ এর আধুনিক সংস্করণগুলো সাসপেন্ডেড ফাংশনকে স্বাভাবিকভাবেই সমর্থন করে। সর্বোপরি, আদর্শ কর্মপ্রবাহটি হলো—ভিউমডেল কো-রুটিন চালু করবে, রিপোজিটরি বিজনেস লজিক সামলাবে এবং ডেটা সোর্স ডিসপ্যাচার্স.আইও (Dispatchers.IO) -তে অনুরোধ পাঠাবে , যেখানে সর্বদা একটি সাবলীল ইন্টারফেস এবং পরিচ্ছন্ন কোড বজায় থাকবে।

কীভাবে একটি এন্টারপ্রাইজ অ্যান্ড্রয়েড অ্যাপ্লিকেশনের লেয়ারকে কোটলিন মাল্টিপ্ল্যাটফর্মে সুষ্ঠুভাবে মাইগ্রেট করা যায়
সম্পর্কিত নিবন্ধ:
কীভাবে একটি এন্টারপ্রাইজ অ্যান্ড্রয়েড অ্যাপ্লিকেশনের লেয়ারকে কোটলিন মাল্টিপ্ল্যাটফর্মে সুষ্ঠুভাবে মাইগ্রেট করা যায়

কো-রুটিন ব্যবহার অ্যান্ড্রয়েড ডেভেলপমেন্টকে আমূল পরিবর্তন করে দেয়, যা প্রচলিত থ্রেডের জটিলতাকে একটি কার্যকর সাসপেনশন সিস্টেম এবং লাইফসাইকেল-বাউন্ড স্কোপ দ্বারা প্রতিস্থাপন করে। `launch`-এর দ্রুত ফায়ারিং এবং `await`-এর সাথে `async`-এর সমান্তরাল ক্ষমতার মধ্যেকার পার্থক্য বোঝার মাধ্যমে, এবং সঠিক ডিসপ্যাচার বেছে নেওয়ার সাহায্যে, আপনি এমন শক্তিশালী সফটওয়্যার তৈরি করতে পারেন যা ব্যবহারকারীর অভিজ্ঞতার সাথে আপোস না করে ডিভাইসের রিসোর্সের সর্বোচ্চ ব্যবহার নিশ্চিত করে। এই গাইডটি শেয়ার করুন যাতে অন্য ব্যবহারকারীরাও এটি সম্পর্কে জানতে পারে।


গুগল একাউন্ট ছাড়াই গুগল প্লে স্টোর
এটা আপনার আগ্রহ হতে পারে:
গুগল অ্যাকাউন্ট না রেখে কীভাবে প্লে স্টোর থেকে অ্যাপস ডাউনলোড করবেন download
Google-এ পছন্দের উৎস হিসেবে যোগ করুন