কম্পোজে সাইড ইফেক্ট নিয়ন্ত্রণ: কখন LaunchedEffect এবং SideEffect ব্যবহার করবেন

  • ইন্টারফেস রেন্ডারিং এবং ইফেক্ট ব্যবহারের মাধ্যমে বাহ্যিক লজিক সম্পাদনের মধ্যে পার্থক্য।
  • লাইফসাইকেল অনুযায়ী LaunchedEffect এবং rememberCoroutineScope ব্যবহার করে নিরাপদ কো-রুটিন প্রয়োগ করা।
  • derivedStateOf এবং produceState-এর মাধ্যমে স্টেট ম্যানেজমেন্ট ব্যবহার করে UI পারফরম্যান্স অপ্টিমাইজেশন।
  • DisposableEffect এবং SideEffect ব্যবহার করে রিসোর্স ক্লিনআপ ম্যানেজমেন্ট এবং এক্সটার্নাল স্টেট সিনক্রোনাইজেশন।

কম্পোজে সাইড ইফেক্ট নিয়ন্ত্রণ: কখন LaunchedEffect এবং SideEffect ব্যবহার করবেন

যখন আমরা Jetpack Compose দিয়ে ডেভেলপমেন্ট শুরু করি , তখন কম্পোজেবল ফাংশনগুলো একাধিকবার এবং যেকোনো ক্রমে চালানো যায়—এই ধারণাটি শুনে প্রথমে কিছুটা অবাক হওয়া স্বাভাবিক। মূলত, একটি কম্পোজেবল ফাংশনে প্রবেশ করা অনেকটা লাভার উপর হাঁটার মতো : আপনি সেখানে যেকোনো কোড চালাতে পারবেন না, কারণ তা করলে পরপর দশটি টোস্ট চালু হয়ে যেতে পারে অথবা প্রতিবার স্ক্রিন ফ্লিকার করার সাথে সাথে অ্যানালিটিক্স ইভেন্ট ট্রিগার হতে পারে।

এই বিশৃঙ্খলা এড়ানোর জন্য, কম্পোজ সাইড এফেক্টস নামক একটি সুবিধা প্রদান করে। এগুলো হলো নিয়ন্ত্রিত এবং নিরাপদ পরিবেশ, যেখানে আমরা ইন্টারফেস আঁকার সাথে সম্পর্কহীন লজিক রাখতে পারি। এর ফলে কোডটি ঠিক তখনই কার্যকর হয় যখন আমরা চাই, এবং ফ্রেমওয়ার্ক যখন এলিমেন্টটিকে পুনর্গঠন করার সিদ্ধান্ত নেয় তখন নয়।

অ্যাসিঙ্ক্রোনাস টাস্কের জন্য LaunchedEffect-এ দক্ষতা অর্জন

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

একটি গুরুত্বপূর্ণ বিষয় হলো আমরা যে কী (key) গুলো পাস করি। যদি কোনো কী-এর মান পরিবর্তিত হয়, তাহলে ইফেক্টটি বাতিল হয়ে যায় এবং প্রথম থেকে আবার শুরু হয় । এটি সেইসব অ্যানিমেশনের জন্য খুবই উপযোগী যা কোনো ভেরিয়েবলের উপর নির্ভর করে , অথবা যখন ইউজার আইডি পরিবর্তিত হয় তখন কোনো এপিআই (API) থেকে ডেটা লোড করার জন্য। তবে, যদি আপনি চান যে কম্পোনেন্টটির জীবদ্দশায় কোনো কিছু কেবল একবারই চলুক, তাহলে আপনি প্যারামিটার হিসেবে `Unit` বা `true` পাস করতে পারেন ।

কখনও কখনও আমাদের একটি সাসপেন্ড ফাংশন এক্সিকিউট করার প্রয়োজন হয়, কিন্তু আমরা কম্পোজিশনের ভিতরে থাকি না; বরং, আমরা একটি ইউজার ইভেন্ট, যেমন একটি বাটন ক্লিক , নিয়ে কাজ করি। এইসব ক্ষেত্রে, আমরা `LaunchedEffect` ব্যবহার করতে পারি না। এর সমাধান হলো `rememberCoroutineScope` , যা আমাদের কম্পোজেবলের লাইফসাইকেলের সাথে লিঙ্ক করা একটি স্কোপ দেয়, কিন্তু যা আমরা `scope.launch` ব্যবহার করে ম্যানুয়ালি ট্রিগার করতে পারি।

সম্পর্কিত নিবন্ধ:
অ্যান্ড্রয়েড অ্যাক্টিভিটি লাইফসাইকেলের সম্পূর্ণ নির্দেশিকা: মৌলিক বিষয় থেকে জেটপ্যাক কম্পোজ পর্যন্ত

rememberUpdatedState ব্যবহার করে অপ্রয়োজনীয় রিস্টার্ট এড়ানো

এমন কিছু জটিল পরিস্থিতি তৈরি হয় যেখানে একটি দীর্ঘস্থায়ী ইফেক্ট থাকে এবং আমরা চাই না যে কিছু ভ্যারিয়েবল পরিবর্তিত হলেও সেটি পুনরায় শুরু হোক। এখানেই rememberUpdatedState কাজে আসে। এই টুলটি LaunchedEffect-কে কাউন্টডাউন বা প্রসেসটি পুনরায় শুরু করতে বাধ্য না করেই একটি ল্যাম্বডা ফাংশন বা ভ্যালুর সবচেয়ে সাম্প্রতিক সংস্করণটি ধারণ করতে আমাদের সাহায্য করে ।

এটি বিশেষ করে লোডিং স্ক্রিন বা স্প্ল্যাশ স্ক্রিনে খুব দরকারি। ধরুন, আপনার একটি টাইমার আছে যা সময় শেষ হলে আপনাকে জানাতে হবে; টাইমারটি চলার সময় যদি কলব্যাক ফাংশনটি পরিবর্তিত হয়, তবে আপনাকে আর ডিলে রিসেট করতে হবে না , আপনি শুধু চাইবেন যে এটি শেষ হলে ফাংশনটির সর্বশেষ সংস্করণটি কার্যকর হোক।

সিঙ্ক্রোনাইজেশন এবং পরিষ্করণ: সাইডইফেক্ট এবং ডিসপোজেবলইফেক্ট

বিষয়টা শুধু কো-রুটিন নিয়েই নয়। কখনও কখনও কোনো বাহ্যিক লাইব্রেরিকে কিছু পরিবর্তনের কথা জানানোর জন্য আমাদের শুধু Compose-এর প্রয়োজন হয়। প্রতিটি সফল রিকম্পোজিশনের পরে SideEffect রান করে । Compose দ্বারা পরিচালিত নয় এমন অবজেক্টের সাথে UI স্টেট সিঙ্ক্রোনাইজ করার জন্য এটি একটি আদর্শ টুল, যেমন Firebase অ্যানালিটিক্স সার্ভিসে কোনো ইউজার প্রপার্টি আপডেট করা।

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

কার্যকলাপের জীবনচক্র
সম্পর্কিত নিবন্ধ:
অ্যান্ড্রয়েডে অ্যাক্টিভিটি লাইফসাইকেলের সম্পূর্ণ নির্দেশিকা
  • সহজ সিঙ্ক্রোনাইজেশন: বাহ্যিক অবস্থা আপডেট করার জন্য সাইডইফেক্ট।
  • সম্পদ ব্যবস্থাপনা: মেমরি লিক এড়ানোর জন্য ডিসপোজেবলইফেক্ট।
  • তথ্য প্রবাহ: কম্পোজ স্টেটগুলোকে কোটলিন ফ্লোতে রূপান্তর করার জন্য snapshotFlow ব্যবহার করা হয়।

derivedStateOf এবং produceState ব্যবহার করে স্টেট অপ্টিমাইজেশন

কম্পোজে সাইড ইফেক্ট নিয়ন্ত্রণ: কখন LaunchedEffect এবং SideEffect ব্যবহার করবেন

যখন আমাদের কোনো স্টেট ক্রমাগত পরিবর্তন হতে থাকে, যেমন একটি লিস্টের স্ক্রল পজিশন, তখন অতিরিক্ত রিকম্পোজিশনের ফলে পারফরম্যান্স মারাত্মকভাবে কমে যেতে পারে। এর সমাধান হলো ডিরাইভডস্টেটঅফ (derivedStateOf )। এটি একটি ডিরাইভড স্টেট তৈরি করে যা শুধুমাত্র চূড়ান্ত ফলাফল পরিবর্তিত হলেই রিকম্পোজিশন শুরু করে, এবং এটি অনেকটা 'ডিস্টিংক্ট আনটিল চেঞ্জ' (distinct until change) ফিল্টারের মতো কাজ করে।

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

যারা LiveData বা Flow থেকে আসছেন এবং সেই ডেটাকে Compose-এর বোধগম্য কোনো কিছুতে রূপান্তর করতে চান, তাদের জন্য produceState হলো সেরা উপায় । এটি একটি কো-রুটিন চালু করে যা একটি State অবজেক্টে ভ্যালু নির্গত করতে পারে। মূলত, এটি ডেটা সংগ্রহের লজিককে একটি রিঅ্যাক্টিভ স্টেট হিসেবে প্রকাশ করে, যা UI সহজেই পর্যবেক্ষণ করতে পারে।

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

সাইড এফেক্টের উপর সম্পূর্ণ নিয়ন্ত্রণ থাকার অর্থ হলো প্রতিটি কাজের জন্য সঠিক টুলটি বেছে নিতে জানা; তা সে টেস্টিং সহজ করার জন্য কন্টেইনার ক্লাসে স্টেট এনক্যাপসুলেট করাই হোক, কিংবা ডিভাইস ঘোরানোর সময় ডেটা লস রোধ করতে rememberSaveable সহ কাস্টম সেভ ব্যবহার করাই হোক। শেষ পর্যন্ত, এর মূল উদ্দেশ্য হলো একটি একমুখী ডেটা প্রবাহ বজায় রাখা এবং এটা নিশ্চিত করা যে বিজনেস লজিক যেন ইন্টারফেস রেন্ডারিং প্রক্রিয়ায় হস্তক্ষেপ না করে।

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

অ্যান্ড্রয়েডের জন্য সার্ফশার্ক অ্যান্টিভাইরাস
এটা আপনার আগ্রহ হতে পারে:
অ্যান্ড্রয়েড থেকে ভাইরাস দূর করার উপায়: আপনার ফোন পরিষ্কার করার একটি সম্পূর্ণ ও হালনাগাদ নির্দেশিকা
Google-এ পছন্দের উৎস হিসেবে যোগ করুন