Android Kotlin Fundamentals 06.2: Coroutines and Room

এই কোডল্যাবটি Android Kotlin Fundamentals কোর্সের অংশ। আপনি যদি কোডল্যাবগুলি ক্রমানুসারে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।

ভূমিকা

আপনার অ্যাপের জন্য একটি ত্রুটিহীন ব্যবহারকারীর অভিজ্ঞতা তৈরি করার জন্য শীর্ষ অগ্রাধিকারগুলির মধ্যে একটি হল নিশ্চিত করা যে UI সর্বদা প্রতিক্রিয়াশীল এবং মসৃণভাবে চলে। UI কর্মক্ষমতা উন্নত করার একটি উপায় হল দীর্ঘ-চলমান কাজগুলি, যেমন ডাটাবেস অপারেশনগুলিকে পটভূমিতে স্থানান্তর করা।

এই কোডল্যাবে, আপনি মূল থ্রেড থেকে দূরে ডাটাবেস ক্রিয়াকলাপ সম্পাদন করতে Kotlin coroutines ব্যবহার করে TrackMySleepQuality অ্যাপের ব্যবহারকারী-মুখী অংশ বাস্তবায়ন করেন।

আপনি ইতিমধ্যে কি জানা উচিত

আপনার সাথে পরিচিত হওয়া উচিত:

  • একটি কার্যকলাপ, টুকরো, দৃশ্য এবং ক্লিক হ্যান্ডলার ব্যবহার করে একটি মৌলিক ব্যবহারকারী ইন্টারফেস (UI) তৈরি করা।
  • টুকরোগুলির মধ্যে নেভিগেট করা এবং টুকরোগুলির মধ্যে সাধারণ ডেটা পাস করতে safeArgs ব্যবহার করে৷
  • মডেল দেখুন, মডেল কারখানা দেখুন, রূপান্তর, এবং LiveData
  • কিভাবে একটি Room ডাটাবেস তৈরি করতে হয়, একটি DAO তৈরি করতে হয় এবং সত্তাকে সংজ্ঞায়িত করতে হয়।
  • আপনি যদি থ্রেডিং এবং মাল্টিপ্রসেসিং ধারণার সাথে পরিচিত হন তবে এটি সহায়ক।

আপনি কি শিখবেন

  • Android এ থ্রেড কিভাবে কাজ করে।
  • ডাটাবেস ক্রিয়াকলাপগুলিকে মূল থ্রেড থেকে দূরে সরাতে কোটলিন কোরোটিনগুলি কীভাবে ব্যবহার করবেন।
  • কিভাবে একটি TextView এ ফরম্যাট করা ডেটা প্রদর্শন করবেন।

আপনি কি করবেন

  • ডাটাবেসের মধ্যে এবং থেকে ডেটা সংগ্রহ, সঞ্চয় এবং প্রদর্শন করতে TrackMySleepQuality অ্যাপটি প্রসারিত করুন।
  • ব্যাকগ্রাউন্ডে দীর্ঘ-চলমান ডাটাবেস ক্রিয়াকলাপগুলি চালানোর জন্য coroutines ব্যবহার করুন।
  • নেভিগেশন এবং স্ন্যাকবারের প্রদর্শন ট্রিগার করতে LiveData ব্যবহার করুন।
  • বোতাম সক্রিয় এবং নিষ্ক্রিয় করতে LiveData ব্যবহার করুন।

এই কোডল্যাবে, আপনি TrackMySleepQuality অ্যাপের ভিউ মডেল, কোরোটিন এবং ডেটা-ডিসপ্লে অংশ তৈরি করেন।

অ্যাপটিতে দুটি স্ক্রীন রয়েছে, যা খন্ড দ্বারা উপস্থাপিত হয়, যেমনটি নীচের চিত্রে দেখানো হয়েছে।

বাম দিকে দেখানো প্রথম স্ক্রিনে ট্র্যাকিং শুরু এবং বন্ধ করার বোতাম রয়েছে৷ স্ক্রিনটি ব্যবহারকারীর ঘুমের সমস্ত ডেটা দেখায়। ক্লিয়ার বোতামটি স্থায়ীভাবে সমস্ত ডেটা মুছে দেয় যা অ্যাপ ব্যবহারকারীর জন্য সংগ্রহ করেছে।

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

ব্যবহারকারীর প্রবাহ নিম্নরূপ:

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

এই অ্যাপটি একটি সরলীকৃত আর্কিটেকচার ব্যবহার করে, যেমনটি সম্পূর্ণ আর্কিটেকচারের প্রসঙ্গে নীচে দেখানো হয়েছে। অ্যাপ্লিকেশন শুধুমাত্র নিম্নলিখিত উপাদান ব্যবহার করে:

  • UI কন্ট্রোলার
  • মডেল এবং LiveData দেখুন
  • একটি রুম ডাটাবেস

এই টাস্কে, আপনি ফর্ম্যাট করা স্লিপ ট্র্যাকিং ডেটা প্রদর্শন করতে একটি TextView ব্যবহার করেন। (এটি চূড়ান্ত ইন্টারফেস নয়। আপনি অন্য কোডল্যাবে আরও ভাল উপায় শিখবেন।)

আপনি আগের কোডল্যাবে তৈরি TrackMySleepQuality অ্যাপটি চালিয়ে যেতে পারেন অথবা এই কোডল্যাবের জন্য স্টার্টার অ্যাপ ডাউনলোড করতে পারেন।

ধাপ 1: স্টার্টার অ্যাপটি ডাউনলোড করুন এবং চালান

  1. GitHub থেকে TrackMySleepQuality-Coroutines-Starter অ্যাপ ডাউনলোড করুন।
  2. অ্যাপটি তৈরি করুন এবং চালান। অ্যাপটি SleepTrackerFragment খণ্ডের জন্য UI দেখায়, কিন্তু কোনো ডেটা নেই। বোতামগুলি ট্যাপগুলিতে সাড়া দেয় না।

ধাপ 2: কোড পরিদর্শন করুন

এই কোডল্যাবের স্টার্টার কোডটি 6.1 একটি রুম ডেটাবেস কোডল্যাবের সমাধান কোডের মতোই

  1. res/layout/activity_main.xml খুলুন। এই লেআউটে nav_host_fragment ফ্র্যাগমেন্ট রয়েছে। এছাড়াও, <merge> ট্যাগটি লক্ষ্য করুন।

    লেআউটগুলি অন্তর্ভুক্ত করার সময় অপ্রয়োজনীয় লেআউটগুলি দূর করতে merge ট্যাগ ব্যবহার করা যেতে পারে এবং এটি ব্যবহার করা একটি ভাল ধারণা। একটি অপ্রয়োজনীয় লেআউটের একটি উদাহরণ হবে ConstraintLayout > LinearLayout > TextView, যেখানে সিস্টেমটি LinearLayout বাদ দিতে সক্ষম হতে পারে। এই ধরনের অপ্টিমাইজেশান ভিউ হায়ারার্কিকে সহজ করতে পারে এবং অ্যাপের কর্মক্ষমতা উন্নত করতে পারে।
  2. নেভিগেশন ফোল্ডারে, navigation.xml খুলুন। আপনি দুটি খণ্ড এবং তাদের সংযোগকারী নেভিগেশন ক্রিয়া দেখতে পারেন৷
  3. লেআউট ফোল্ডারে, এর XML লেআউট দেখতে স্লিপ ট্র্যাকার ফ্র্যাগমেন্টে ডাবল-ক্লিক করুন। নিম্নলিখিত লক্ষ্য করুন:
  • লেআউট ডেটা ডেটা বাইন্ডিং সক্ষম করতে একটি <layout> উপাদানে মোড়ানো হয়।
  • ConstraintLayout এবং অন্যান্য ভিউ <layout> এলিমেন্টের ভিতরে সাজানো আছে।
  • ফাইলটিতে একটি স্থানধারক <data> ট্যাগ রয়েছে।

স্টার্টার অ্যাপটি UI এর জন্য মাত্রা, রঙ এবং স্টাইলিংও প্রদান করে। অ্যাপটিতে একটি Room ডাটাবেস, একটি DAO এবং একটি SleepNight সত্তা রয়েছে৷ আপনি যদি পূর্ববর্তী কোডল্যাবটি সম্পূর্ণ না করে থাকেন তবে নিশ্চিত করুন যে আপনি নিজেই কোডের এই দিকগুলি অন্বেষণ করেছেন৷

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

ধাপ 1: SleepTrackerViewModel যোগ করুন

  1. স্লিপট্র্যাকার প্যাকেজে, SleepTrackerViewModel.kt খুলুন।
  2. SleepTrackerViewModel ক্লাস পরিদর্শন করুন, যা আপনার জন্য স্টার্টার অ্যাপে দেওয়া হয়েছে এবং নীচেও দেখানো হয়েছে। মনে রাখবেন যে ক্লাসটি AndroidViewModel() প্রসারিত করে। এই ক্লাসটি ViewModel এর মতই, কিন্তু এটি একটি প্যারামিটার হিসাবে অ্যাপ্লিকেশন প্রসঙ্গ নেয় এবং এটি একটি সম্পত্তি হিসাবে উপলব্ধ করে। আপনি পরে এটি প্রয়োজন হবে.
class SleepTrackerViewModel(
       val database: SleepDatabaseDao,
       application: Application) : AndroidViewModel(application) {
}

ধাপ 2: SleepTrackerViewModelFactory যোগ করুন

  1. স্লিপট্র্যাকার প্যাকেজে, SleepTrackerViewModelFactory.kt খুলুন
  2. কারখানার জন্য আপনার জন্য দেওয়া কোডটি পরীক্ষা করুন, যা নীচে দেখানো হয়েছে:
class SleepTrackerViewModelFactory(
       private val dataSource: SleepDatabaseDao,
       private val application: Application) : ViewModelProvider.Factory {
   @Suppress("unchecked_cast")
   override fun <T : ViewModel?> create(modelClass: Class<T>): T {
       if (modelClass.isAssignableFrom(SleepTrackerViewModel::class.java)) {
           return SleepTrackerViewModel(dataSource, application) as T
       }
       throw IllegalArgumentException("Unknown ViewModel class")
   }
}

নিম্নলিখিত নোট নিন:

  • প্রদত্ত SleepTrackerViewModelFactory ViewModel-এর মতো একই যুক্তি গ্রহণ করে এবং ViewModel প্রসারিত ViewModelProvider.Factory
  • কারখানার অভ্যন্তরে, কোডটি create() ওভাররাইড করে, যা যেকোন শ্রেণির ধরনকে আর্গুমেন্ট হিসেবে নেয় এবং একটি ViewModel
  • create() এর বডিতে, কোডটি পরীক্ষা করে যে সেখানে একটি SleepTrackerViewModel ক্লাস উপলব্ধ আছে, এবং যদি থাকে, তাহলে সেটির একটি উদাহরণ প্রদান করে। অন্যথায়, কোডটি একটি ব্যতিক্রম নিক্ষেপ করে।

ধাপ 3: SleepTrackerFragment আপডেট করুন

  1. SleepTrackerFragment এ, অ্যাপ্লিকেশন প্রসঙ্গে একটি রেফারেন্স পান। রেফারেন্সটি onCreateView()binding নিচে রাখুন। ভিউ-মডেল ফ্যাক্টরি প্রদানকারীতে পাস করার জন্য এই খণ্ডটি যে অ্যাপের সাথে সংযুক্ত আছে তার একটি রেফারেন্স প্রয়োজন।

    requireNotNull ফাংশনটি একটি IllegalArgumentException নিক্ষেপ করে যদি মানটি null হয়।
val application = requireNotNull(this.activity).application
  1. আপনার DAO-এর একটি রেফারেন্সের মাধ্যমে আপনার ডেটা উত্সের একটি রেফারেন্স প্রয়োজন। onCreateView() এ, return আগে, একটি dataSource সংজ্ঞায়িত করুন। ডাটাবেসের DAO-এর রেফারেন্স পেতে, SleepDatabase.getInstance(application).sleepDatabaseDao ব্যবহার করুন।
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
  1. onCreateView() এ, return আগে, viewModelFactory এর একটি উদাহরণ তৈরি করুন। আপনাকে এটি পাস করতে হবে dataSource এবং application
val viewModelFactory = SleepTrackerViewModelFactory(dataSource, application)
  1. এখন যেহেতু আপনার একটি কারখানা আছে, SleepTrackerViewModel এর একটি রেফারেন্স পান। SleepTrackerViewModel::class.java প্যারামিটারটি এই অবজেক্টের রানটাইম জাভা ক্লাসকে বোঝায়।
val sleepTrackerViewModel =
       ViewModelProviders.of(
               this, viewModelFactory).get(SleepTrackerViewModel::class.java)
  1. আপনার সমাপ্ত কোড এই মত হওয়া উচিত:
// Create an instance of the ViewModel Factory.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
val viewModelFactory = SleepTrackerViewModelFactory(dataSource, application)

// Get a reference to the ViewModel associated with this fragment.
val sleepTrackerViewModel =
       ViewModelProviders.of(
               this, viewModelFactory).get(SleepTrackerViewModel::class.java)

এখানে এখন পর্যন্ত onCreateView() পদ্ধতি রয়েছে:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {

        // Get a reference to the binding object and inflate the fragment views.
        val binding: FragmentSleepTrackerBinding = DataBindingUtil.inflate(
                inflater, R.layout.fragment_sleep_tracker, container, false)

        val application = requireNotNull(this.activity).application

        val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao

        val viewModelFactory = SleepTrackerViewModelFactory(dataSource, application)

        val sleepTrackerViewModel =
                ViewModelProviders.of(
                        this, viewModelFactory).get(SleepTrackerViewModel::class.java)

        return binding.root
    }

ধাপ 4: ভিউ মডেলের জন্য ডেটা বাইন্ডিং যোগ করুন

বেসিক ViewModel থাকা অবস্থায়, আপনাকে UI-এর সাথে ViewModel সংযোগ করতে SleepTrackerFragment এ ডেটা বাইন্ডিং সেট আপ করা শেষ করতে হবে।


fragment_sleep_tracker.xml লেআউট ফাইলে:

  1. <data> ব্লকের ভিতরে, একটি <variable> তৈরি করুন যা SleepTrackerViewModel ক্লাসের উল্লেখ করে।
<data>
   <variable
       name="sleepTrackerViewModel"
       type="com.example.android.trackmysleepquality.sleeptracker.SleepTrackerViewModel" />
</data>

SleepTrackerFragment :

  1. বাইন্ডিংয়ের জীবনচক্র মালিক হিসাবে বর্তমান কার্যকলাপ সেট করুন। return স্টেটমেন্টের আগে onCreateView() পদ্ধতির ভিতরে এই কোডটি যোগ করুন:
binding.setLifecycleOwner(this)
  1. sleepTrackerViewModelsleepTrackerViewModel বাইন্ডিং ভেরিয়েবল বরাদ্দ করুন। এই কোডটি onCreateView() এর ভিতরে রাখুন, কোডের নীচে যা SleepTrackerViewModel তৈরি করে:
binding.sleepTrackerViewModel = sleepTrackerViewModel
  1. আপনি সম্ভবত একটি ত্রুটি দেখতে পাবেন, কারণ আপনাকে বাঁধাই বস্তুটি পুনরায় তৈরি করতে হবে। ত্রুটি পরিত্রাণ পেতে প্রকল্পটি পরিষ্কার এবং পুনর্নির্মাণ করুন।
  2. অবশেষে, সর্বদা হিসাবে, নিশ্চিত করুন যে আপনার কোড তৈরি হয় এবং ত্রুটি ছাড়াই চলে।

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

Coroutine এর নিম্নলিখিত বৈশিষ্ট্য আছে:

  • Coroutines অ্যাসিঙ্ক্রোনাস এবং অ-ব্লকিং।
  • অ্যাসিঙ্ক্রোনাস কোড ক্রমিক করার জন্য কোরোটিনগুলি সাসপেন্ড ফাংশন ব্যবহার করে।

Coroutines অসিঙ্ক্রোনাস হয়.

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

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

Coroutines নন-ব্লকিং।

নন-ব্লকিং এর অর্থ হল একটি কোরোটিন প্রধান বা UI থ্রেডকে ব্লক করে না। তাই কোরোটিনগুলির সাথে, ব্যবহারকারীদের সর্বদা মসৃণতম সম্ভাব্য অভিজ্ঞতা থাকে, কারণ UI ইন্টারঅ্যাকশনের সর্বদা অগ্রাধিকার থাকে।

অ্যাসিঙ্ক্রোনাস কোড ক্রমিক করার জন্য কোরোটিনগুলি সাসপেন্ড ফাংশন ব্যবহার করে।

কীওয়ার্ড suspend হল কোটলিনের একটি ফাংশন, বা ফাংশনের ধরন চিহ্নিত করার উপায়, যা করটিনগুলিতে উপলব্ধ। যখন একটি coroutine suspend দ্বারা চিহ্নিত একটি ফাংশনকে কল করে, যতক্ষণ না ফাংশনটি একটি স্বাভাবিক ফাংশন কলের মতো ফিরে আসে ততক্ষণ ব্লক করার পরিবর্তে, ফলাফল প্রস্তুত না হওয়া পর্যন্ত coroutine কার্য সম্পাদন স্থগিত করে। তারপর কোরোটিন যেখানে ছেড়েছিল সেখানে আবার শুরু হয়, ফলাফল সহ।

যখন কোরোটিন স্থগিত করা হয় এবং ফলাফলের জন্য অপেক্ষা করা হয়, তখন এটি যে থ্রেডটি চলছে সেটিকে আনব্লক করে। এই ভাবে, অন্যান্য ফাংশন বা coroutines চালানো যাবে.

suspend কীওয়ার্ড কোডটি যে থ্রেডে চলে তা নির্দিষ্ট করে না। একটি সাসপেন্ড ফাংশন ব্যাকগ্রাউন্ড থ্রেডে বা প্রধান থ্রেডে চলতে পারে।

কোটলিনে কোরোটিন ব্যবহার করতে আপনার তিনটি জিনিসের প্রয়োজন:

  • চাকরি
  • একজন প্রেরক
  • একটি সুযোগ

চাকরি : মূলত, একটি চাকরি এমন কিছু যা বাতিল করা যেতে পারে। প্রতিটি কোরোটিনের একটি কাজ আছে এবং আপনি কাজটি ব্যবহার করে করটিন বাতিল করতে পারেন। চাকরিগুলি পিতামাতা-সন্তানের শ্রেণিবিন্যাসে সাজানো যেতে পারে। একটি অভিভাবক চাকরি অবিলম্বে বাতিল করা সমস্ত চাকরির সন্তানদের বাতিল করে, যা প্রতিটি করটিন ম্যানুয়ালি বাতিল করার চেয়ে অনেক বেশি সুবিধাজনক।

প্রেরণকারী : প্রেরক বিভিন্ন থ্রেডে চালানোর জন্য কোরোটিন পাঠায়। উদাহরণস্বরূপ, Dispatcher.Main মূল থ্রেডে টাস্ক চালায় এবং Dispatcher.IO অফলোড করে I/O টাস্কগুলিকে থ্রেডের শেয়ার্ড পুলে ব্লক করে।

ব্যাপ্তি: একটি করটিনের স্কোপ সেই প্রেক্ষাপটকে সংজ্ঞায়িত করে যেখানে করটিন চলে। একটি সুযোগ একটি করটিনের কাজ এবং প্রেরণকারী সম্পর্কে তথ্য একত্রিত করে। স্কোপগুলি করুটিনের ট্র্যাক রাখে। আপনি যখন একটি করোটিন চালু করেন, তখন এটি "একটি সুযোগে" থাকে যার অর্থ আপনি নির্দেশ করেছেন কোন স্কোপটি করোটিনের ট্র্যাক রাখবে৷

আপনি চান যে ব্যবহারকারী নিম্নলিখিত উপায়ে ঘুমের ডেটার সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হন:

  • ব্যবহারকারী যখন স্টার্ট বোতামে ট্যাপ করে, অ্যাপটি একটি নতুন ঘুমের রাত তৈরি করে এবং ডাটাবেসে ঘুমের রাত সঞ্চয় করে।
  • ব্যবহারকারী যখন স্টপ বোতামে ট্যাপ করে, অ্যাপটি শেষ সময়ের সাথে রাত আপডেট করে।
  • ব্যবহারকারী যখন ক্লিয়ার বোতামে ট্যাপ করে, অ্যাপটি ডাটাবেসের ডেটা মুছে ফেলে।

এই ডাটাবেস অপারেশনগুলি দীর্ঘ সময় নিতে পারে, তাই তাদের একটি পৃথক থ্রেডে চালানো উচিত।

ধাপ 1: ডাটাবেস অপারেশনের জন্য কোরোটিন সেট আপ করুন

যখন স্লিপ ট্র্যাকার অ্যাপে স্টার্ট বোতামটি ট্যাপ করা হয়, আপনি SleepNight SleepTrackerViewModel ফাংশন কল করতে চান৷

যেকোনো বোতামে ট্যাপ করলে একটি ডাটাবেস অপারেশন ট্রিগার হয়, যেমন SleepNight তৈরি বা আপডেট করা। এই কারণে এবং অন্যদের জন্য, আপনি অ্যাপের বোতামগুলির জন্য ক্লিক হ্যান্ডলারগুলি প্রয়োগ করতে কোরোটিনগুলি ব্যবহার করেন৷

  1. অ্যাপ-লেভেল build.gradle ফাইলটি খুলুন এবং coroutines-এর জন্য নির্ভরতা খুঁজুন। coroutines ব্যবহার করার জন্য, আপনার এই নির্ভরতা প্রয়োজন, যা আপনার জন্য যোগ করা হয়েছে।

    $coroutine_version coroutine_version প্রকল্প build.gradle ফাইলে coroutine_version coroutine_version = '1.0.0' হিসাবে সংজ্ঞায়িত করা হয়েছে
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version"
  1. SleepTrackerViewModel ফাইলটি খুলুন।
  2. ক্লাসের মূল অংশে, viewModelJob সংজ্ঞায়িত করুন এবং এটি Job এর একটি উদাহরণ বরাদ্দ করুন। এই viewModelJob আপনাকে এই ভিউ মডেল দ্বারা শুরু করা সমস্ত কোরোটিন বাতিল করতে দেয় যখন ভিউ মডেলটি আর ব্যবহার করা হয় না এবং ধ্বংস হয়ে যায়। এইভাবে, আপনি কোরোটিনগুলির সাথে শেষ করবেন না যেগুলিতে ফিরে যাওয়ার কোথাও নেই।
private var viewModelJob = Job()
  1. ক্লাসের মূল অংশের শেষে, onCleared() ওভাররাইড করুন এবং সমস্ত coroutines বাতিল করুন। ViewModel ধ্বংস হয়ে গেলে, onCleared() বলা হয়।
override fun onCleared() {
   super.onCleared()
   viewModelJob.cancel()
}
  1. viewModelJob এর সংজ্ঞার ঠিক নীচে, coroutines-এর জন্য একটি uiScope সংজ্ঞায়িত করুন। কোরোটিন কোন থ্রেডে চলবে তা স্কোপ নির্ধারণ করে, এবং স্কোপের কাজ সম্পর্কেও জানতে হবে। একটি সুযোগ পেতে, CoroutineScope এর একটি উদাহরণের জন্য জিজ্ঞাসা করুন এবং একজন প্রেরণকারী এবং একটি চাকরিতে পাস করুন৷

Dispatchers.Main ব্যবহার করার মানে হল যে uiScope-এ চালু করা uiScope প্রধান থ্রেডে চলবে। এটি একটি ViewModel দ্বারা শুরু করা অনেক coroutines-এর জন্য বোধগম্য, কারণ এই coroutineগুলি কিছু প্রক্রিয়াকরণ করার পরে, তারা UI-এর আপডেট করে৷

private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
  1. uiScope এর সংজ্ঞার নীচে, বর্তমান রাত ধরে রাখার জন্য tonight রাত নামক একটি পরিবর্তনশীল সংজ্ঞায়িত করুন। পরিবর্তনশীল MutableLiveData তৈরি করুন, কারণ আপনাকে ডেটা পর্যবেক্ষণ করতে এবং এটি পরিবর্তন করতে সক্ষম হতে হবে।
private var tonight = MutableLiveData<SleepNight?>()
  1. tonight ভেরিয়েবল যত তাড়াতাড়ি সম্ভব আরম্ভ করতে, tonight এর সংজ্ঞার নীচে একটি init ব্লক তৈরি করুন এবং initializeTonight() কল করুন। আপনি পরবর্তী ধাপে initializeTonight() সংজ্ঞায়িত করুন।
init {
   initializeTonight()
}
  1. init ব্লকের নীচে, initializeTonight() প্রয়োগ করুন। uiScope এ, একটি করুটিন চালু করুন। ভিতরে, getTonightFromDatabase() এ কল করে ডাটাবেস থেকে tonight মান পান এবং tonight.value এ মান নির্ধারণ করুন। আপনি পরবর্তী ধাপে getTonightFromDatabase() সংজ্ঞায়িত করুন।
private fun initializeTonight() {
   uiScope.launch {
       tonight.value = getTonightFromDatabase()
   }
}
  1. getTonightFromDatabase() প্রয়োগ করুন। এটিকে একটি private suspend ফাংশন হিসাবে সংজ্ঞায়িত করুন যা একটি বাতিলযোগ্য SleepNight , যদি SleepNight চালু না হয়। এটি আপনাকে একটি ত্রুটির সাথে ছেড়ে দেয়, কারণ ফাংশনটিকে কিছু ফেরত দিতে হবে।
private suspend fun getTonightFromDatabase(): SleepNight? { }
  1. getTonightFromDatabase() এর ফাংশন বডির ভিতরে, Dispatchers.IO প্রসঙ্গে চলে এমন একটি coroutine থেকে ফলাফল ফেরত দিন। I/O প্রেরক ব্যবহার করুন, কারণ ডাটাবেস থেকে ডেটা পাওয়া একটি I/O অপারেশন এবং UI এর সাথে কোনো সম্পর্ক নেই।
  return withContext(Dispatchers.IO) {}
  1. রিটার্ন ব্লকের ভিতরে, ডাটাবেস থেকে কোরোটিন আজ রাতে (নতুন রাত) পেতে দিন। যদি শুরু এবং শেষের সময় একই না হয়, যার অর্থ হল রাত ইতিমধ্যেই সম্পন্ন হয়েছে, null ফেরত দিন। নইলে রাতে ফিরবে।
       var night = database.getTonight()
       if (night?.endTimeMilli != night?.startTimeMilli) {
           night = null
       }
       night

আপনার সম্পন্ন getTonightFromDatabase() সাসপেন্ড ফাংশনটি এইরকম হওয়া উচিত। আর কোন ত্রুটি থাকা উচিত নয়।

private suspend fun getTonightFromDatabase(): SleepNight? {
   return withContext(Dispatchers.IO) {
       var night = database.getTonight()
       if (night?.endTimeMilli != night?.startTimeMilli) {
           night = null
       }
       night
   }
}

ধাপ 2: স্টার্ট বোতামের জন্য ক্লিক হ্যান্ডলার যোগ করুন

এখন আপনি onStartTracking() প্রয়োগ করতে পারেন, স্টার্ট বোতামের জন্য ক্লিক হ্যান্ডলার। আপনাকে একটি নতুন SleepNight তৈরি করতে হবে, এটি ডাটাবেসে ঢোকাতে হবে এবং tonight এটিকে বরাদ্দ করতে হবে। onStartTracking() এর গঠনটি দেখতে অনেকটা initializeTonight() টুনাইট() এর মত হবে।

  1. onStartTracking() এর জন্য ফাংশন সংজ্ঞা দিয়ে শুরু করুন। আপনি SleepTrackerViewModel ফাইলে onCleared() ক্লিক হ্যান্ডলারগুলিকে উপরে রাখতে পারেন।
fun onStartTracking() {}
  1. onStartTracking() এর ভিতরে, uiScope-এ একটি uiScope চালু করুন, কারণ UI চালিয়ে যেতে এবং আপডেট করতে আপনার এই ফলাফলের প্রয়োজন৷
uiScope.launch {}
  1. কোরোটিন লঞ্চের ভিতরে, একটি নতুন SleepNight তৈরি করুন, যা বর্তমান সময়কে শুরুর সময় হিসাবে ক্যাপচার করে৷
        val newNight = SleepNight()
  1. এখনও কর্উটিন লঞ্চের ভিতরে, ডাটাবেসে newNight সন্নিবেশ করতে insert() কল করুন। আপনি একটি ত্রুটি দেখতে পাবেন, কারণ আপনি এখনও এই insert() সাসপেন্ড ফাংশনটি সংজ্ঞায়িত করেননি। (এটি একই নামের DAO ফাংশন নয়।)
       insert(newNight)
  1. এছাড়াও করোটিন লঞ্চের ভিতরে, tonight আপডেট করুন।
       tonight.value = getTonightFromDatabase()
  1. onStartTracking() নীচে, insert() কে একটি private suspend ফাংশন হিসাবে সংজ্ঞায়িত করুন যা একটি SleepNight এর আর্গুমেন্ট হিসাবে নেয়।
private suspend fun insert(night: SleepNight) {}
  1. insert() এর বডির জন্য, I/O প্রসঙ্গে একটি coroutine চালু করুন এবং DAO থেকে insert() কল করে ডাটাবেসে নাইট ঢোকান।
   withContext(Dispatchers.IO) {
       database.insert(night)
   }
  1. fragment_sleep_tracker.xml লেআউট ফাইলে, onStartTracking() এর জন্য ক্লিক হ্যান্ডলার যোগ করুন start_button এ ডাটা বাইন্ডিং এর ম্যাজিক ব্যবহার করে যা আপনি আগে সেট আপ করেছেন। @{() -> ফাংশন নোটেশন একটি ল্যাম্বডা ফাংশন তৈরি করে যা কোনো আর্গুমেন্ট নেয় না এবং sleepTrackerViewModel এ ক্লিক হ্যান্ডলারকে কল করে।
android:onClick="@{() -> sleepTrackerViewModel.onStartTracking()}"
  1. আপনার অ্যাপ তৈরি করুন এবং চালান। স্টার্ট বোতামে ট্যাপ করুন। এই ক্রিয়াটি ডেটা তৈরি করে, কিন্তু আপনি এখনও কিছু দেখতে পাচ্ছেন না। আপনি পরবর্তী এটি ঠিক করুন.
fun someWorkNeedsToBeDone {
   uiScope.launch {

        suspendFunction()

   }
}

suspend fun suspendFunction() {
   withContext(Dispatchers.IO) {
       longrunningWork()
   }
}

ধাপ 3: ডেটা প্রদর্শন করুন

SleepTrackerViewModel এ, nights পরিবর্তনশীল LiveData উল্লেখ করে কারণ DAO-তে getAllNights() LiveData করে।

এটি একটি Room বৈশিষ্ট্য যে প্রতিবার ডাটাবেসের ডেটা পরিবর্তিত হয়, সর্বশেষ ডেটা দেখানোর জন্য LiveData nights আপডেট করা হয়। আপনাকে কখনই স্পষ্টভাবে LiveData সেট করতে বা আপডেট করতে হবে না। Room ডেটাবেসের সাথে মেলে ডেটা আপডেট করে।

যাইহোক, যদি আপনি একটি টেক্সট ভিউতে nights প্রদর্শন করেন তবে এটি বস্তুর রেফারেন্স দেখাবে। বস্তুর বিষয়বস্তু দেখতে, একটি বিন্যাসিত স্ট্রিং মধ্যে তথ্য রূপান্তর. একটি Transformation মানচিত্র ব্যবহার করুন যা প্রতিবার nights ডাটাবেস থেকে নতুন ডেটা গ্রহণ করার সময় কার্যকর করা হয়।

  1. Util.kt ফাইলটি খুলুন এবং formatNights() এবং সংশ্লিষ্ট import বিবৃতিগুলির সংজ্ঞার জন্য কোডটি আনকমেন্ট করুন। অ্যান্ড্রয়েড স্টুডিওতে কোড আনকমেন্ট করতে, // দিয়ে চিহ্নিত সমস্ত কোড নির্বাচন করুন এবং Cmd+/ বা Control+/ টিপুন।
  2. লক্ষ্য করুন যে formatNights() একটি টাইপ Spanned , যা একটি HTML-ফরম্যাটেড স্ট্রিং।
  3. strings.xml খুলুন। ঘুমের ডেটা প্রদর্শনের জন্য স্ট্রিং সংস্থান বিন্যাস করতে CDATA এর ব্যবহার লক্ষ্য করুন।
  4. SleepTrackerViewModel খুলুন। SleepTrackerViewModel ক্লাসে, uiScope এর সংজ্ঞার নীচে, nights নামক একটি পরিবর্তনশীল সংজ্ঞায়িত করুন। ডাটাবেস থেকে সমস্ত রাতগুলি পান এবং nights পরিবর্তনশীলে তাদের বরাদ্দ করুন।
private val nights = database.getAllNights()
  1. nights সংজ্ঞার ঠিক নীচে, nightsString nights এ রূপান্তর করতে কোড যোগ করুন। Util.kt থেকে Util.kt formatNights() ফাংশন ব্যবহার করুন।

    Transformations ক্লাস থেকে map() ফাংশনে nights কাটুন। আপনার স্ট্রিং সংস্থানগুলিতে অ্যাক্সেস পেতে, ম্যাপিং ফাংশনটিকে কলিং formatNights() হিসাবে সংজ্ঞায়িত করুন। সরবরাহ nights এবং একটি Resources বস্তু.
val nightsString = Transformations.map(nights) { nights ->
   formatNights(nights, application.resources)
}
  1. fragment_sleep_tracker.xml লেআউট ফাইলটি খুলুন। TextView এ, android:text প্রপার্টিতে, আপনি এখন রিসোর্স স্ট্রিংটিকে nightsString এর রেফারেন্স দিয়ে প্রতিস্থাপন করতে পারেন।
"@{sleepTrackerViewModel.nightsString}"
  1. আপনার কোড পুনর্নির্মাণ করুন এবং অ্যাপটি চালান। শুরুর সময় সহ আপনার সমস্ত ঘুমের ডেটা এখন প্রদর্শিত হওয়া উচিত।
  2. স্টার্ট বোতামে আরও কয়েকবার আলতো চাপুন এবং আপনি আরও ডেটা দেখতে পাবেন।

পরবর্তী ধাপে, আপনি স্টপ বোতামের জন্য কার্যকারিতা সক্ষম করুন।

ধাপ 4: স্টপ বোতামের জন্য ক্লিক হ্যান্ডলার যোগ করুন

আগের ধাপের মতো একই প্যাটার্ন ব্যবহার করে, SleepTrackerViewModel-এ স্টপ বোতামের জন্য ক্লিক হ্যান্ডলার প্রয়োগ করুন SleepTrackerViewModel.

  1. ViewModel-এ ViewModel onStopTracking() যোগ করুন। uiScope-এ একটি uiScope চালু করুন। যদি শেষের সময় এখনও সেট করা না থাকে, তাহলে endTimeMilli বর্তমান সিস্টেমের সময় সেট করুন এবং রাতের ডেটা সহ update() কল করুন।

    Kotlin-এ, return@ label সিনট্যাক্স এমন ফাংশন নির্দিষ্ট করে যেখান থেকে এই স্টেটমেন্টটি বেশ কয়েকটি নেস্টেড ফাংশনের মধ্যে রিটার্ন করে।
fun onStopTracking() {
   uiScope.launch {
       val oldNight = tonight.value ?: return@launch
       oldNight.endTimeMilli = System.currentTimeMillis()
       update(oldNight)
   }
}
  1. আপনি insert() প্রয়োগ করতে যে প্যাটার্ন ব্যবহার করেছিলেন সেই প্যাটার্ন ব্যবহার করে update() প্রয়োগ করুন।
private suspend fun update(night: SleepNight) {
   withContext(Dispatchers.IO) {
       database.update(night)
   }
}
  1. ক্লিক হ্যান্ডলারটিকে UI-তে সংযোগ করতে, fragment_sleep_tracker.xml লেআউট ফাইলটি খুলুন এবং stop_button এ ক্লিক হ্যান্ডলার যোগ করুন।
android:onClick="@{() -> sleepTrackerViewModel.onStopTracking()}"
  1. আপনার অ্যাপ তৈরি করুন এবং চালান।
  2. শুরুতে আলতো চাপুন, তারপরে থামুন আলতো চাপুন। আপনি শুরুর সময়, শেষের সময়, ঘুমের গুণমান কোন মূল্য ছাড়াই, এবং ঘুমের সময় দেখতে পান।

ধাপ 5: ক্লিয়ার বোতামের জন্য ক্লিক হ্যান্ডলার যোগ করুন

  1. একইভাবে, onClear() এবং clear() প্রয়োগ করুন।
fun onClear() {
   uiScope.launch {
       clear()
       tonight.value = null
   }
}

suspend fun clear() {
   withContext(Dispatchers.IO) {
       database.clear()
   }
}
  1. ক্লিক হ্যান্ডলারটিকে UI-তে সংযুক্ত করতে, fragment_sleep_tracker.xml খুলুন এবং clear_button এ ক্লিক হ্যান্ডলার যোগ করুন।
android:onClick="@{() -> sleepTrackerViewModel.onClear()}"
  1. আপনার অ্যাপ তৈরি করুন এবং চালান।
  2. সমস্ত ডেটা পরিত্রাণ পেতে সাফ আলতো চাপুন। তারপর নতুন ডেটা তৈরি করতে স্টার্ট এবং স্টপ ট্যাপ করুন।

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: TrackMySleepQualityCoroutines

  • অ্যাপটির জন্য UI আর্কিটেকচার সেট আপ করতে ViewModel , ViewModelFactory এবং ডেটা বাইন্ডিং ব্যবহার করুন৷
  • UI মসৃণভাবে চালানোর জন্য, সমস্ত ডাটাবেস ক্রিয়াকলাপগুলির মতো দীর্ঘ-চলমান কাজগুলির জন্য কোরোটিনগুলি ব্যবহার করুন৷
  • Coroutines অ্যাসিঙ্ক্রোনাস এবং অ-ব্লকিং। তারা অ্যাসিঙ্ক্রোনাস কোড ক্রমিক করতে suspend ফাংশন ব্যবহার করে।
  • যখন একটি coroutine suspend দিয়ে চিহ্নিত একটি ফাংশনকে কল করে, যতক্ষণ না সেই ফাংশনটি একটি সাধারণ ফাংশন কলের মতো ফিরে আসে ততক্ষণ ব্লক করার পরিবর্তে, ফলাফল প্রস্তুত না হওয়া পর্যন্ত এটি সম্পাদন স্থগিত করে। তারপরে এটি ফলাফলের সাথে যেখানে ছেড়ে গিয়েছিল সেখানে পুনরায় শুরু হয়।
  • ব্লক করা এবং স্থগিত করার মধ্যে পার্থক্য হল যে যদি একটি থ্রেড ব্লক করা হয়, অন্য কোন কাজ হয় না। থ্রেড স্থগিত করা হলে, ফলাফল উপলব্ধ না হওয়া পর্যন্ত অন্যান্য কাজ ঘটবে।

একটি করুটিন চালু করতে, আপনার একটি চাকরি, একটি প্রেরণকারী এবং একটি সুযোগ প্রয়োজন:

  • মূলত, একটি চাকরি এমন কিছু যা বাতিল করা যেতে পারে। প্রতিটি কোরোটিনের একটি কাজ আছে এবং আপনি একটি কোরোটিন বাতিল করতে একটি কাজ ব্যবহার করতে পারেন।
  • প্রেরক বিভিন্ন থ্রেডে চালানোর জন্য কোরোটিন পাঠায়। Dispatcher.Main প্রধান থ্রেডে টাস্ক চালায়, এবং Dispartcher.IO হল থ্রেডের শেয়ার্ড পুলে ব্লক করা I/O টাস্ক অফলোড করার জন্য।
  • কোরোটিন যে প্রেক্ষাপটে চলে তা সংজ্ঞায়িত করার জন্য সুযোগটি চাকরি এবং প্রেরণকারী সহ তথ্যকে একত্রিত করে। স্কোপগুলি করুটিনের ট্র্যাক রাখে।

ডাটাবেস ক্রিয়াকলাপগুলিকে ট্রিগার করে এমন ক্লিক হ্যান্ডলারগুলি বাস্তবায়ন করতে, এই প্যাটার্নটি অনুসরণ করুন:

  1. একটি করুটিন চালু করুন যা প্রধান বা UI থ্রেডে চলে, কারণ ফলাফলটি UI-কে প্রভাবিত করে।
  2. দীর্ঘ-চলমান কাজটি করতে একটি সাসপেন্ড ফাংশন কল করুন, যাতে ফলাফলের জন্য অপেক্ষা করার সময় আপনি UI থ্রেড ব্লক না করেন।
  3. দীর্ঘমেয়াদী কাজের সাথে UI এর কোন সম্পর্ক নেই, তাই I/O প্রসঙ্গে স্যুইচ করুন। এইভাবে, কাজটি একটি থ্রেড পুলে চলতে পারে যা অপ্টিমাইজ করা হয়েছে এবং এই ধরনের ক্রিয়াকলাপগুলির জন্য আলাদা করে রাখা হয়েছে।
  4. তারপর ডাটাবেস ফাংশন কল করুন কাজ করতে।

প্রতিবার অবজেক্ট পরিবর্তিত হলে একটি LiveData অবজেক্ট থেকে একটি স্ট্রিং তৈরি করতে একটি Transformations মানচিত্র ব্যবহার করুন।

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশন:

অন্যান্য ডকুমেন্টেশন এবং নিবন্ধ:

এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলিকে তারা যতটা কম বা যতটা চান ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলি ব্যবহার করুন।

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

কোরোটিনের সুবিধা নিচের কোনটি:

  • তারা নন-ব্লকিং
  • তারা অ্যাসিঙ্ক্রোনাসভাবে চালায়।
  • এগুলি মূল থ্রেড ছাড়া অন্য থ্রেডে চালানো যেতে পারে।
  • তারা সবসময় অ্যাপকে দ্রুত চালায়।
  • তারা ব্যতিক্রম ব্যবহার করতে পারেন.
  • এগুলি লিনিয়ার কোড হিসাবে লেখা এবং পড়া যায়।

প্রশ্ন 2

একটি সাসপেন্ড ফাংশন কি?

  • suspend কীওয়ার্ড দিয়ে টীকা করা একটি সাধারণ ফাংশন।
  • একটি ফাংশন যা কোরোটিনের ভিতরে বলা যেতে পারে।
  • একটি সাসপেন্ড ফাংশন চলাকালীন, কলিং থ্রেড সাসপেন্ড করা হয়।
  • সাসপেন্ড ফাংশন সবসময় ব্যাকগ্রাউন্ডে চলতে হবে।

প্রশ্ন 3

একটি থ্রেড ব্লক করা এবং সাসপেন্ড করার মধ্যে পার্থক্য কি? যে সব সত্য চিহ্নিত করুন.

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

পরবর্তী পাঠ শুরু করুন: 6.3 বোতামের অবস্থা নিয়ন্ত্রণ করতে LiveData ব্যবহার করুন

এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।