এই কোডল্যাবটি 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: স্টার্টার অ্যাপটি ডাউনলোড করুন এবং চালান
- GitHub থেকে TrackMySleepQuality-Coroutines-Starter অ্যাপ ডাউনলোড করুন।
- অ্যাপটি তৈরি করুন এবং চালান। অ্যাপটি
SleepTrackerFragment
খণ্ডের জন্য UI দেখায়, কিন্তু কোনো ডেটা নেই। বোতামগুলি ট্যাপগুলিতে সাড়া দেয় না।
ধাপ 2: কোড পরিদর্শন করুন
এই কোডল্যাবের স্টার্টার কোডটি 6.1 একটি রুম ডেটাবেস কোডল্যাবের সমাধান কোডের মতোই ।
- res/layout/activity_main.xml খুলুন। এই লেআউটে
nav_host_fragment
ফ্র্যাগমেন্ট রয়েছে। এছাড়াও,<merge>
ট্যাগটি লক্ষ্য করুন।
লেআউটগুলি অন্তর্ভুক্ত করার সময় অপ্রয়োজনীয় লেআউটগুলি দূর করতেmerge
ট্যাগ ব্যবহার করা যেতে পারে এবং এটি ব্যবহার করা একটি ভাল ধারণা। একটি অপ্রয়োজনীয় লেআউটের একটি উদাহরণ হবে ConstraintLayout > LinearLayout > TextView, যেখানে সিস্টেমটি LinearLayout বাদ দিতে সক্ষম হতে পারে। এই ধরনের অপ্টিমাইজেশান ভিউ হায়ারার্কিকে সহজ করতে পারে এবং অ্যাপের কর্মক্ষমতা উন্নত করতে পারে। - নেভিগেশন ফোল্ডারে, navigation.xml খুলুন। আপনি দুটি খণ্ড এবং তাদের সংযোগকারী নেভিগেশন ক্রিয়া দেখতে পারেন৷
- লেআউট ফোল্ডারে, এর XML লেআউট দেখতে স্লিপ ট্র্যাকার ফ্র্যাগমেন্টে ডাবল-ক্লিক করুন। নিম্নলিখিত লক্ষ্য করুন:
- লেআউট ডেটা ডেটা বাইন্ডিং সক্ষম করতে একটি
<layout>
উপাদানে মোড়ানো হয়। -
ConstraintLayout
এবং অন্যান্য ভিউ<layout>
এলিমেন্টের ভিতরে সাজানো আছে। - ফাইলটিতে একটি স্থানধারক
<data>
ট্যাগ রয়েছে।
স্টার্টার অ্যাপটি UI এর জন্য মাত্রা, রঙ এবং স্টাইলিংও প্রদান করে। অ্যাপটিতে একটি Room
ডাটাবেস, একটি DAO এবং একটি SleepNight
সত্তা রয়েছে৷ আপনি যদি পূর্ববর্তী কোডল্যাবটি সম্পূর্ণ না করে থাকেন তবে নিশ্চিত করুন যে আপনি নিজেই কোডের এই দিকগুলি অন্বেষণ করেছেন৷
এখন আপনার কাছে একটি ডাটাবেস এবং একটি UI আছে, আপনাকে ডেটা সংগ্রহ করতে হবে, ডেটাবেসে ডেটা যোগ করতে হবে এবং ডেটা প্রদর্শন করতে হবে। এই সমস্ত কাজ ভিউ মডেলে করা হয়। আপনার স্লিপ-ট্র্যাকার ভিউ মডেল বোতাম ক্লিকগুলি পরিচালনা করবে, DAO-এর মাধ্যমে ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করবে এবং LiveData
এর মাধ্যমে UI-তে ডেটা সরবরাহ করবে। সমস্ত ডাটাবেস ক্রিয়াকলাপগুলিকে প্রধান UI থ্রেড থেকে দূরে সরে যেতে হবে এবং আপনি কোরোটিন ব্যবহার করে তা করবেন।
ধাপ 1: SleepTrackerViewModel যোগ করুন
- স্লিপট্র্যাকার প্যাকেজে, SleepTrackerViewModel.kt খুলুন।
-
SleepTrackerViewModel
ক্লাস পরিদর্শন করুন, যা আপনার জন্য স্টার্টার অ্যাপে দেওয়া হয়েছে এবং নীচেও দেখানো হয়েছে। মনে রাখবেন যে ক্লাসটিAndroidViewModel()
প্রসারিত করে। এই ক্লাসটিViewModel
এর মতই, কিন্তু এটি একটি প্যারামিটার হিসাবে অ্যাপ্লিকেশন প্রসঙ্গ নেয় এবং এটি একটি সম্পত্তি হিসাবে উপলব্ধ করে। আপনি পরে এটি প্রয়োজন হবে.
class SleepTrackerViewModel(
val database: SleepDatabaseDao,
application: Application) : AndroidViewModel(application) {
}
ধাপ 2: SleepTrackerViewModelFactory যোগ করুন
- স্লিপট্র্যাকার প্যাকেজে, SleepTrackerViewModelFactory.kt খুলুন ।
- কারখানার জন্য আপনার জন্য দেওয়া কোডটি পরীক্ষা করুন, যা নীচে দেখানো হয়েছে:
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 আপডেট করুন
-
SleepTrackerFragment
এ, অ্যাপ্লিকেশন প্রসঙ্গে একটি রেফারেন্স পান। রেফারেন্সটিonCreateView()
এbinding
নিচে রাখুন। ভিউ-মডেল ফ্যাক্টরি প্রদানকারীতে পাস করার জন্য এই খণ্ডটি যে অ্যাপের সাথে সংযুক্ত আছে তার একটি রেফারেন্স প্রয়োজন।
requireNotNull
ফাংশনটি একটিIllegalArgumentException
নিক্ষেপ করে যদি মানটিnull
হয়।
val application = requireNotNull(this.activity).application
- আপনার DAO-এর একটি রেফারেন্সের মাধ্যমে আপনার ডেটা উত্সের একটি রেফারেন্স প্রয়োজন।
onCreateView()
এ,return
আগে, একটিdataSource
সংজ্ঞায়িত করুন। ডাটাবেসের DAO-এর রেফারেন্স পেতে,SleepDatabase.getInstance(application).sleepDatabaseDao
ব্যবহার করুন।
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
-
onCreateView()
এ,return
আগে,viewModelFactory
এর একটি উদাহরণ তৈরি করুন। আপনাকে এটি পাস করতে হবেdataSource
এবংapplication
।
val viewModelFactory = SleepTrackerViewModelFactory(dataSource, application)
- এখন যেহেতু আপনার একটি কারখানা আছে,
SleepTrackerViewModel
এর একটি রেফারেন্স পান।SleepTrackerViewModel::class.java
প্যারামিটারটি এই অবজেক্টের রানটাইম জাভা ক্লাসকে বোঝায়।
val sleepTrackerViewModel =
ViewModelProviders.of(
this, viewModelFactory).get(SleepTrackerViewModel::class.java)
- আপনার সমাপ্ত কোড এই মত হওয়া উচিত:
// 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
লেআউট ফাইলে:
-
<data>
ব্লকের ভিতরে, একটি<variable>
তৈরি করুন যাSleepTrackerViewModel
ক্লাসের উল্লেখ করে।
<data>
<variable
name="sleepTrackerViewModel"
type="com.example.android.trackmysleepquality.sleeptracker.SleepTrackerViewModel" />
</data>
SleepTrackerFragment
:
- বাইন্ডিংয়ের জীবনচক্র মালিক হিসাবে বর্তমান কার্যকলাপ সেট করুন।
return
স্টেটমেন্টের আগেonCreateView()
পদ্ধতির ভিতরে এই কোডটি যোগ করুন:
binding.setLifecycleOwner(this)
-
sleepTrackerViewModel
এsleepTrackerViewModel
বাইন্ডিং ভেরিয়েবল বরাদ্দ করুন। এই কোডটিonCreateView()
এর ভিতরে রাখুন, কোডের নীচে যাSleepTrackerViewModel
তৈরি করে:
binding.sleepTrackerViewModel = sleepTrackerViewModel
- আপনি সম্ভবত একটি ত্রুটি দেখতে পাবেন, কারণ আপনাকে বাঁধাই বস্তুটি পুনরায় তৈরি করতে হবে। ত্রুটি পরিত্রাণ পেতে প্রকল্পটি পরিষ্কার এবং পুনর্নির্মাণ করুন।
- অবশেষে, সর্বদা হিসাবে, নিশ্চিত করুন যে আপনার কোড তৈরি হয় এবং ত্রুটি ছাড়াই চলে।
কোটলিনে, কোরোটিনগুলি দীর্ঘ-চলমান কাজগুলি মার্জিত এবং দক্ষতার সাথে পরিচালনা করার উপায়। Kotlin coroutines আপনাকে কলব্যাক-ভিত্তিক কোডকে ক্রমিক কোডে রূপান্তর করতে দেয়। ক্রমানুসারে লেখা কোড সাধারণত পড়া সহজ এবং এমনকি ব্যতিক্রমের মতো ভাষা বৈশিষ্ট্যও ব্যবহার করতে পারে। শেষ পর্যন্ত, কোরোটিন এবং কলব্যাকগুলি একই কাজ করে: তারা দীর্ঘ-চলমান টাস্ক থেকে ফলাফল পাওয়া পর্যন্ত অপেক্ষা করে এবং সম্পাদন চালিয়ে যায়।
Coroutine এর নিম্নলিখিত বৈশিষ্ট্য আছে:
- Coroutines অ্যাসিঙ্ক্রোনাস এবং অ-ব্লকিং।
- অ্যাসিঙ্ক্রোনাস কোড ক্রমিক করার জন্য কোরোটিনগুলি সাসপেন্ড ফাংশন ব্যবহার করে।
Coroutines অসিঙ্ক্রোনাস হয়.
একটি করুটিন আপনার প্রোগ্রামের প্রধান কার্যকরী পদক্ষেপ থেকে স্বাধীনভাবে চলে। এটি সমান্তরাল বা একটি পৃথক প্রসেসরে হতে পারে। এটি এমনও হতে পারে যে অ্যাপের বাকি অংশটি ইনপুটের জন্য অপেক্ষা করছে, আপনি কিছুটা প্রক্রিয়াকরণের মধ্যে লুকিয়ে থাকবেন। অ্যাসিঙ্কের একটি গুরুত্বপূর্ণ দিক হল আপনি আশা করতে পারবেন না যে ফলাফলটি পাওয়া যাবে, যতক্ষণ না আপনি স্পষ্টভাবে এটির জন্য অপেক্ষা করছেন।
উদাহরণ স্বরূপ, ধরা যাক আপনার কাছে একটি প্রশ্ন আছে যার জন্য গবেষণা প্রয়োজন, এবং আপনি একজন সহকর্মীকে উত্তর খুঁজতে বলবেন। তারা চলে যায় এবং এটিতে কাজ করে, যা তারা "অসিঙ্ক্রোনাসভাবে" এবং "একটি পৃথক থ্রেডে" কাজটি করছে। আপনি উত্তরের উপর নির্ভর করে না এমন অন্যান্য কাজ চালিয়ে যেতে পারেন, যতক্ষণ না আপনার সহকর্মী ফিরে এসে আপনাকে উত্তরটি কী বলে।
Coroutines নন-ব্লকিং।
নন-ব্লকিং এর অর্থ হল একটি কোরোটিন প্রধান বা UI থ্রেডকে ব্লক করে না। তাই কোরোটিনগুলির সাথে, ব্যবহারকারীদের সর্বদা মসৃণতম সম্ভাব্য অভিজ্ঞতা থাকে, কারণ UI ইন্টারঅ্যাকশনের সর্বদা অগ্রাধিকার থাকে।
অ্যাসিঙ্ক্রোনাস কোড ক্রমিক করার জন্য কোরোটিনগুলি সাসপেন্ড ফাংশন ব্যবহার করে।
কীওয়ার্ড suspend
হল কোটলিনের একটি ফাংশন, বা ফাংশনের ধরন চিহ্নিত করার উপায়, যা করটিনগুলিতে উপলব্ধ। যখন একটি coroutine suspend
দ্বারা চিহ্নিত একটি ফাংশনকে কল করে, যতক্ষণ না ফাংশনটি একটি স্বাভাবিক ফাংশন কলের মতো ফিরে আসে ততক্ষণ ব্লক করার পরিবর্তে, ফলাফল প্রস্তুত না হওয়া পর্যন্ত coroutine কার্য সম্পাদন স্থগিত করে। তারপর কোরোটিন যেখানে ছেড়েছিল সেখানে আবার শুরু হয়, ফলাফল সহ।
যখন কোরোটিন স্থগিত করা হয় এবং ফলাফলের জন্য অপেক্ষা করা হয়, তখন এটি যে থ্রেডটি চলছে সেটিকে আনব্লক করে। এই ভাবে, অন্যান্য ফাংশন বা coroutines চালানো যাবে.
suspend
কীওয়ার্ড কোডটি যে থ্রেডে চলে তা নির্দিষ্ট করে না। একটি সাসপেন্ড ফাংশন ব্যাকগ্রাউন্ড থ্রেডে বা প্রধান থ্রেডে চলতে পারে।
কোটলিনে কোরোটিন ব্যবহার করতে আপনার তিনটি জিনিসের প্রয়োজন:
- চাকরি
- একজন প্রেরক
- একটি সুযোগ
চাকরি : মূলত, একটি চাকরি এমন কিছু যা বাতিল করা যেতে পারে। প্রতিটি কোরোটিনের একটি কাজ আছে এবং আপনি কাজটি ব্যবহার করে করটিন বাতিল করতে পারেন। চাকরিগুলি পিতামাতা-সন্তানের শ্রেণিবিন্যাসে সাজানো যেতে পারে। একটি অভিভাবক চাকরি অবিলম্বে বাতিল করা সমস্ত চাকরির সন্তানদের বাতিল করে, যা প্রতিটি করটিন ম্যানুয়ালি বাতিল করার চেয়ে অনেক বেশি সুবিধাজনক।
প্রেরণকারী : প্রেরক বিভিন্ন থ্রেডে চালানোর জন্য কোরোটিন পাঠায়। উদাহরণস্বরূপ, Dispatcher.Main
মূল থ্রেডে টাস্ক চালায় এবং Dispatcher.IO
অফলোড করে I/O টাস্কগুলিকে থ্রেডের শেয়ার্ড পুলে ব্লক করে।
ব্যাপ্তি: একটি করটিনের স্কোপ সেই প্রেক্ষাপটকে সংজ্ঞায়িত করে যেখানে করটিন চলে। একটি সুযোগ একটি করটিনের কাজ এবং প্রেরণকারী সম্পর্কে তথ্য একত্রিত করে। স্কোপগুলি করুটিনের ট্র্যাক রাখে। আপনি যখন একটি করোটিন চালু করেন, তখন এটি "একটি সুযোগে" থাকে যার অর্থ আপনি নির্দেশ করেছেন কোন স্কোপটি করোটিনের ট্র্যাক রাখবে৷
আপনি চান যে ব্যবহারকারী নিম্নলিখিত উপায়ে ঘুমের ডেটার সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হন:
- ব্যবহারকারী যখন স্টার্ট বোতামে ট্যাপ করে, অ্যাপটি একটি নতুন ঘুমের রাত তৈরি করে এবং ডাটাবেসে ঘুমের রাত সঞ্চয় করে।
- ব্যবহারকারী যখন স্টপ বোতামে ট্যাপ করে, অ্যাপটি শেষ সময়ের সাথে রাত আপডেট করে।
- ব্যবহারকারী যখন ক্লিয়ার বোতামে ট্যাপ করে, অ্যাপটি ডাটাবেসের ডেটা মুছে ফেলে।
এই ডাটাবেস অপারেশনগুলি দীর্ঘ সময় নিতে পারে, তাই তাদের একটি পৃথক থ্রেডে চালানো উচিত।
ধাপ 1: ডাটাবেস অপারেশনের জন্য কোরোটিন সেট আপ করুন
যখন স্লিপ ট্র্যাকার অ্যাপে স্টার্ট বোতামটি ট্যাপ করা হয়, আপনি SleepNight
SleepTrackerViewModel
ফাংশন কল করতে চান৷
যেকোনো বোতামে ট্যাপ করলে একটি ডাটাবেস অপারেশন ট্রিগার হয়, যেমন SleepNight
তৈরি বা আপডেট করা। এই কারণে এবং অন্যদের জন্য, আপনি অ্যাপের বোতামগুলির জন্য ক্লিক হ্যান্ডলারগুলি প্রয়োগ করতে কোরোটিনগুলি ব্যবহার করেন৷
- অ্যাপ-লেভেল
build.gradle
ফাইলটি খুলুন এবং coroutines-এর জন্য নির্ভরতা খুঁজুন। coroutines ব্যবহার করার জন্য, আপনার এই নির্ভরতা প্রয়োজন, যা আপনার জন্য যোগ করা হয়েছে।
$coroutine_version
coroutine_version প্রকল্পbuild.gradle
ফাইলে coroutine_versioncoroutine_version =
'1.0.0'
হিসাবে সংজ্ঞায়িত করা হয়েছে ।
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version"
-
SleepTrackerViewModel
ফাইলটি খুলুন। - ক্লাসের মূল অংশে,
viewModelJob
সংজ্ঞায়িত করুন এবং এটিJob
এর একটি উদাহরণ বরাদ্দ করুন। এইviewModelJob
আপনাকে এই ভিউ মডেল দ্বারা শুরু করা সমস্ত কোরোটিন বাতিল করতে দেয় যখন ভিউ মডেলটি আর ব্যবহার করা হয় না এবং ধ্বংস হয়ে যায়। এইভাবে, আপনি কোরোটিনগুলির সাথে শেষ করবেন না যেগুলিতে ফিরে যাওয়ার কোথাও নেই।
private var viewModelJob = Job()
- ক্লাসের মূল অংশের শেষে,
onCleared()
ওভাররাইড করুন এবং সমস্ত coroutines বাতিল করুন।ViewModel
ধ্বংস হয়ে গেলে,onCleared()
বলা হয়।
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}
-
viewModelJob
এর সংজ্ঞার ঠিক নীচে, coroutines-এর জন্য একটিuiScope
সংজ্ঞায়িত করুন। কোরোটিন কোন থ্রেডে চলবে তা স্কোপ নির্ধারণ করে, এবং স্কোপের কাজ সম্পর্কেও জানতে হবে। একটি সুযোগ পেতে,CoroutineScope
এর একটি উদাহরণের জন্য জিজ্ঞাসা করুন এবং একজন প্রেরণকারী এবং একটি চাকরিতে পাস করুন৷
Dispatchers.Main
ব্যবহার করার মানে হল যে uiScope-এ চালু করা uiScope
প্রধান থ্রেডে চলবে। এটি একটি ViewModel
দ্বারা শুরু করা অনেক coroutines-এর জন্য বোধগম্য, কারণ এই coroutineগুলি কিছু প্রক্রিয়াকরণ করার পরে, তারা UI-এর আপডেট করে৷
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
-
uiScope
এর সংজ্ঞার নীচে, বর্তমান রাত ধরে রাখার জন্যtonight
রাত নামক একটি পরিবর্তনশীল সংজ্ঞায়িত করুন। পরিবর্তনশীলMutableLiveData
তৈরি করুন, কারণ আপনাকে ডেটা পর্যবেক্ষণ করতে এবং এটি পরিবর্তন করতে সক্ষম হতে হবে।
private var tonight = MutableLiveData<SleepNight?>()
-
tonight
ভেরিয়েবল যত তাড়াতাড়ি সম্ভব আরম্ভ করতে,tonight
এর সংজ্ঞার নীচে একটিinit
ব্লক তৈরি করুন এবংinitializeTonight()
কল করুন। আপনি পরবর্তী ধাপেinitializeTonight()
সংজ্ঞায়িত করুন।
init {
initializeTonight()
}
-
init
ব্লকের নীচে,initializeTonight()
প্রয়োগ করুন।uiScope
এ, একটি করুটিন চালু করুন। ভিতরে,getTonightFromDatabase()
এ কল করে ডাটাবেস থেকেtonight
মান পান এবংtonight.value
এ মান নির্ধারণ করুন। আপনি পরবর্তী ধাপেgetTonightFromDatabase()
সংজ্ঞায়িত করুন।
private fun initializeTonight() {
uiScope.launch {
tonight.value = getTonightFromDatabase()
}
}
-
getTonightFromDatabase()
প্রয়োগ করুন। এটিকে একটিprivate suspend
ফাংশন হিসাবে সংজ্ঞায়িত করুন যা একটি বাতিলযোগ্যSleepNight
, যদিSleepNight
চালু না হয়। এটি আপনাকে একটি ত্রুটির সাথে ছেড়ে দেয়, কারণ ফাংশনটিকে কিছু ফেরত দিতে হবে।
private suspend fun getTonightFromDatabase(): SleepNight? { }
-
getTonightFromDatabase()
এর ফাংশন বডির ভিতরে,Dispatchers.IO
প্রসঙ্গে চলে এমন একটি coroutine থেকে ফলাফল ফেরত দিন। I/O প্রেরক ব্যবহার করুন, কারণ ডাটাবেস থেকে ডেটা পাওয়া একটি I/O অপারেশন এবং UI এর সাথে কোনো সম্পর্ক নেই।
return withContext(Dispatchers.IO) {}
- রিটার্ন ব্লকের ভিতরে, ডাটাবেস থেকে কোরোটিন আজ রাতে (নতুন রাত) পেতে দিন। যদি শুরু এবং শেষের সময় একই না হয়, যার অর্থ হল রাত ইতিমধ্যেই সম্পন্ন হয়েছে,
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()
টুনাইট() এর মত হবে।
-
onStartTracking()
এর জন্য ফাংশন সংজ্ঞা দিয়ে শুরু করুন। আপনিSleepTrackerViewModel
ফাইলেonCleared()
ক্লিক হ্যান্ডলারগুলিকে উপরে রাখতে পারেন।
fun onStartTracking() {}
-
onStartTracking()
এর ভিতরে, uiScope-এ একটিuiScope
চালু করুন, কারণ UI চালিয়ে যেতে এবং আপডেট করতে আপনার এই ফলাফলের প্রয়োজন৷
uiScope.launch {}
- কোরোটিন লঞ্চের ভিতরে, একটি নতুন
SleepNight
তৈরি করুন, যা বর্তমান সময়কে শুরুর সময় হিসাবে ক্যাপচার করে৷
val newNight = SleepNight()
- এখনও কর্উটিন লঞ্চের ভিতরে, ডাটাবেসে
newNight
সন্নিবেশ করতেinsert()
কল করুন। আপনি একটি ত্রুটি দেখতে পাবেন, কারণ আপনি এখনও এইinsert()
সাসপেন্ড ফাংশনটি সংজ্ঞায়িত করেননি। (এটি একই নামের DAO ফাংশন নয়।)
insert(newNight)
- এছাড়াও করোটিন লঞ্চের ভিতরে,
tonight
আপডেট করুন।
tonight.value = getTonightFromDatabase()
-
onStartTracking()
নীচে,insert()
কে একটিprivate suspend
ফাংশন হিসাবে সংজ্ঞায়িত করুন যা একটিSleepNight
এর আর্গুমেন্ট হিসাবে নেয়।
private suspend fun insert(night: SleepNight) {}
-
insert()
এর বডির জন্য, I/O প্রসঙ্গে একটি coroutine চালু করুন এবং DAO থেকেinsert()
কল করে ডাটাবেসে নাইট ঢোকান।
withContext(Dispatchers.IO) {
database.insert(night)
}
-
fragment_sleep_tracker.xml
লেআউট ফাইলে,onStartTracking()
এর জন্য ক্লিক হ্যান্ডলার যোগ করুনstart_button
এ ডাটা বাইন্ডিং এর ম্যাজিক ব্যবহার করে যা আপনি আগে সেট আপ করেছেন।@{() ->
ফাংশন নোটেশন একটি ল্যাম্বডা ফাংশন তৈরি করে যা কোনো আর্গুমেন্ট নেয় না এবংsleepTrackerViewModel
এ ক্লিক হ্যান্ডলারকে কল করে।
android:onClick="@{() -> sleepTrackerViewModel.onStartTracking()}"
- আপনার অ্যাপ তৈরি করুন এবং চালান। স্টার্ট বোতামে ট্যাপ করুন। এই ক্রিয়াটি ডেটা তৈরি করে, কিন্তু আপনি এখনও কিছু দেখতে পাচ্ছেন না। আপনি পরবর্তী এটি ঠিক করুন.
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
ডাটাবেস থেকে নতুন ডেটা গ্রহণ করার সময় কার্যকর করা হয়।
-
Util.kt
ফাইলটি খুলুন এবংformatNights()
এবং সংশ্লিষ্টimport
বিবৃতিগুলির সংজ্ঞার জন্য কোডটি আনকমেন্ট করুন। অ্যান্ড্রয়েড স্টুডিওতে কোড আনকমেন্ট করতে,//
দিয়ে চিহ্নিত সমস্ত কোড নির্বাচন করুন এবংCmd+/
বাControl+/
টিপুন। - লক্ষ্য করুন যে
formatNights()
একটি টাইপSpanned
, যা একটি HTML-ফরম্যাটেড স্ট্রিং। - strings.xml খুলুন। ঘুমের ডেটা প্রদর্শনের জন্য স্ট্রিং সংস্থান বিন্যাস করতে
CDATA
এর ব্যবহার লক্ষ্য করুন। - SleepTrackerViewModel খুলুন।
SleepTrackerViewModel
ক্লাসে,uiScope
এর সংজ্ঞার নীচে,nights
নামক একটি পরিবর্তনশীল সংজ্ঞায়িত করুন। ডাটাবেস থেকে সমস্ত রাতগুলি পান এবংnights
পরিবর্তনশীলে তাদের বরাদ্দ করুন।
private val nights = database.getAllNights()
-
nights
সংজ্ঞার ঠিক নীচে,nightsString
nights
এ রূপান্তর করতে কোড যোগ করুন। Util.kt থেকেUtil.kt
formatNights()
ফাংশন ব্যবহার করুন।
Transformations
ক্লাস থেকেmap()
ফাংশনেnights
কাটুন। আপনার স্ট্রিং সংস্থানগুলিতে অ্যাক্সেস পেতে, ম্যাপিং ফাংশনটিকে কলিংformatNights()
হিসাবে সংজ্ঞায়িত করুন। সরবরাহnights
এবং একটিResources
বস্তু.
val nightsString = Transformations.map(nights) { nights ->
formatNights(nights, application.resources)
}
-
fragment_sleep_tracker.xml
লেআউট ফাইলটি খুলুন।TextView
এ,android:text
প্রপার্টিতে, আপনি এখন রিসোর্স স্ট্রিংটিকেnightsString
এর রেফারেন্স দিয়ে প্রতিস্থাপন করতে পারেন।
"@{sleepTrackerViewModel.nightsString}"
- আপনার কোড পুনর্নির্মাণ করুন এবং অ্যাপটি চালান। শুরুর সময় সহ আপনার সমস্ত ঘুমের ডেটা এখন প্রদর্শিত হওয়া উচিত।
- স্টার্ট বোতামে আরও কয়েকবার আলতো চাপুন এবং আপনি আরও ডেটা দেখতে পাবেন।
পরবর্তী ধাপে, আপনি স্টপ বোতামের জন্য কার্যকারিতা সক্ষম করুন।
ধাপ 4: স্টপ বোতামের জন্য ক্লিক হ্যান্ডলার যোগ করুন
আগের ধাপের মতো একই প্যাটার্ন ব্যবহার করে, SleepTrackerViewModel-এ স্টপ বোতামের জন্য ক্লিক হ্যান্ডলার প্রয়োগ করুন SleepTrackerViewModel.
- 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)
}
}
- আপনি
insert()
প্রয়োগ করতে যে প্যাটার্ন ব্যবহার করেছিলেন সেই প্যাটার্ন ব্যবহার করেupdate()
প্রয়োগ করুন।
private suspend fun update(night: SleepNight) {
withContext(Dispatchers.IO) {
database.update(night)
}
}
- ক্লিক হ্যান্ডলারটিকে UI-তে সংযোগ করতে,
fragment_sleep_tracker.xml
লেআউট ফাইলটি খুলুন এবংstop_button
এ ক্লিক হ্যান্ডলার যোগ করুন।
android:onClick="@{() -> sleepTrackerViewModel.onStopTracking()}"
- আপনার অ্যাপ তৈরি করুন এবং চালান।
- শুরুতে আলতো চাপুন, তারপরে থামুন আলতো চাপুন। আপনি শুরুর সময়, শেষের সময়, ঘুমের গুণমান কোন মূল্য ছাড়াই, এবং ঘুমের সময় দেখতে পান।
ধাপ 5: ক্লিয়ার বোতামের জন্য ক্লিক হ্যান্ডলার যোগ করুন
- একইভাবে,
onClear()
এবংclear()
প্রয়োগ করুন।
fun onClear() {
uiScope.launch {
clear()
tonight.value = null
}
}
suspend fun clear() {
withContext(Dispatchers.IO) {
database.clear()
}
}
- ক্লিক হ্যান্ডলারটিকে UI-তে সংযুক্ত করতে,
fragment_sleep_tracker.xml
খুলুন এবংclear_button
এ ক্লিক হ্যান্ডলার যোগ করুন।
android:onClick="@{() -> sleepTrackerViewModel.onClear()}"
- আপনার অ্যাপ তৈরি করুন এবং চালান।
- সমস্ত ডেটা পরিত্রাণ পেতে সাফ আলতো চাপুন। তারপর নতুন ডেটা তৈরি করতে স্টার্ট এবং স্টপ ট্যাপ করুন।
অ্যান্ড্রয়েড স্টুডিও প্রকল্প: TrackMySleepQualityCoroutines
- অ্যাপটির জন্য UI আর্কিটেকচার সেট আপ করতে
ViewModel
,ViewModelFactory
এবং ডেটা বাইন্ডিং ব্যবহার করুন৷ - UI মসৃণভাবে চালানোর জন্য, সমস্ত ডাটাবেস ক্রিয়াকলাপগুলির মতো দীর্ঘ-চলমান কাজগুলির জন্য কোরোটিনগুলি ব্যবহার করুন৷
- Coroutines অ্যাসিঙ্ক্রোনাস এবং অ-ব্লকিং। তারা অ্যাসিঙ্ক্রোনাস কোড ক্রমিক করতে
suspend
ফাংশন ব্যবহার করে। - যখন একটি coroutine
suspend
দিয়ে চিহ্নিত একটি ফাংশনকে কল করে, যতক্ষণ না সেই ফাংশনটি একটি সাধারণ ফাংশন কলের মতো ফিরে আসে ততক্ষণ ব্লক করার পরিবর্তে, ফলাফল প্রস্তুত না হওয়া পর্যন্ত এটি সম্পাদন স্থগিত করে। তারপরে এটি ফলাফলের সাথে যেখানে ছেড়ে গিয়েছিল সেখানে পুনরায় শুরু হয়। - ব্লক করা এবং স্থগিত করার মধ্যে পার্থক্য হল যে যদি একটি থ্রেড ব্লক করা হয়, অন্য কোন কাজ হয় না। থ্রেড স্থগিত করা হলে, ফলাফল উপলব্ধ না হওয়া পর্যন্ত অন্যান্য কাজ ঘটবে।
একটি করুটিন চালু করতে, আপনার একটি চাকরি, একটি প্রেরণকারী এবং একটি সুযোগ প্রয়োজন:
- মূলত, একটি চাকরি এমন কিছু যা বাতিল করা যেতে পারে। প্রতিটি কোরোটিনের একটি কাজ আছে এবং আপনি একটি কোরোটিন বাতিল করতে একটি কাজ ব্যবহার করতে পারেন।
- প্রেরক বিভিন্ন থ্রেডে চালানোর জন্য কোরোটিন পাঠায়।
Dispatcher.Main
প্রধান থ্রেডে টাস্ক চালায়, এবংDispartcher.IO
হল থ্রেডের শেয়ার্ড পুলে ব্লক করা I/O টাস্ক অফলোড করার জন্য। - কোরোটিন যে প্রেক্ষাপটে চলে তা সংজ্ঞায়িত করার জন্য সুযোগটি চাকরি এবং প্রেরণকারী সহ তথ্যকে একত্রিত করে। স্কোপগুলি করুটিনের ট্র্যাক রাখে।
ডাটাবেস ক্রিয়াকলাপগুলিকে ট্রিগার করে এমন ক্লিক হ্যান্ডলারগুলি বাস্তবায়ন করতে, এই প্যাটার্নটি অনুসরণ করুন:
- একটি করুটিন চালু করুন যা প্রধান বা UI থ্রেডে চলে, কারণ ফলাফলটি UI-কে প্রভাবিত করে।
- দীর্ঘ-চলমান কাজটি করতে একটি সাসপেন্ড ফাংশন কল করুন, যাতে ফলাফলের জন্য অপেক্ষা করার সময় আপনি UI থ্রেড ব্লক না করেন।
- দীর্ঘমেয়াদী কাজের সাথে UI এর কোন সম্পর্ক নেই, তাই I/O প্রসঙ্গে স্যুইচ করুন। এইভাবে, কাজটি একটি থ্রেড পুলে চলতে পারে যা অপ্টিমাইজ করা হয়েছে এবং এই ধরনের ক্রিয়াকলাপগুলির জন্য আলাদা করে রাখা হয়েছে।
- তারপর ডাটাবেস ফাংশন কল করুন কাজ করতে।
প্রতিবার অবজেক্ট পরিবর্তিত হলে একটি LiveData
অবজেক্ট থেকে একটি স্ট্রিং তৈরি করতে একটি Transformations
মানচিত্র ব্যবহার করুন।
উদাসীনতা কোর্স:
অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশন:
-
RoomDatabase
- <include/> এর সাথে লেআউট পুনরায় ব্যবহার করা
-
ViewModelProvider.Factory
-
SimpleDateFormat
-
HtmlCompat
অন্যান্য ডকুমেন্টেশন এবং নিবন্ধ:
- কারখানার প্যাটার্ন
- Coroutines codelab
- কোরাটিন, অফিসিয়াল ডকুমেন্টেশন
- কোরাটিন প্রসঙ্গ এবং প্রেরক
-
Dispatchers
- অ্যান্ড্রয়েড স্পিড সীমা অতিক্রম করুন
-
Job
-
launch
- ফিরে আসে এবং কোটলিনে লাফ দেয়
- CDATA মানে অক্ষর ডেটা । CDATA এর অর্থ হল এই স্ট্রিংগুলির মধ্যে থাকা ডেটাতে এমন ডেটা রয়েছে যা XML মার্কআপ হিসাবে ব্যাখ্যা করা যেতে পারে, কিন্তু হওয়া উচিত নয়৷
এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:
- প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
- শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
- হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.
প্রশিক্ষকরা এই পরামর্শগুলিকে তারা যতটা কম বা যতটা চান ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।
আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলি ব্যবহার করুন।
এই প্রশ্নগুলোর উত্তর দাও
প্রশ্ন 1
কোরোটিনের সুবিধা নিচের কোনটি:
- তারা নন-ব্লকিং
- তারা অ্যাসিঙ্ক্রোনাসভাবে চালায়।
- এগুলি মূল থ্রেড ছাড়া অন্য থ্রেডে চালানো যেতে পারে।
- তারা সবসময় অ্যাপকে দ্রুত চালায়।
- তারা ব্যতিক্রম ব্যবহার করতে পারেন.
- এগুলি লিনিয়ার কোড হিসাবে লেখা এবং পড়া যায়।
প্রশ্ন 2
একটি সাসপেন্ড ফাংশন কি?
-
suspend
কীওয়ার্ড দিয়ে টীকা করা একটি সাধারণ ফাংশন। - একটি ফাংশন যা কোরোটিনের ভিতরে বলা যেতে পারে।
- একটি সাসপেন্ড ফাংশন চলাকালীন, কলিং থ্রেড সাসপেন্ড করা হয়।
- সাসপেন্ড ফাংশন সবসময় ব্যাকগ্রাউন্ডে চলতে হবে।
প্রশ্ন 3
একটি থ্রেড ব্লক করা এবং সাসপেন্ড করার মধ্যে পার্থক্য কি? যে সব সত্য চিহ্নিত করুন.
- যখন মৃত্যুদন্ড ব্লক করা হয়, ব্লক করা থ্রেডে অন্য কোন কাজ চালানো যাবে না।
- যখন এক্সিকিউশন স্থগিত করা হয়, অফলোড করা কাজ সম্পূর্ণ হওয়ার জন্য অপেক্ষা করার সময় থ্রেড অন্য কাজ করতে পারে।
- স্থগিত করা আরও কার্যকর, কারণ থ্রেডগুলি অপেক্ষা করছে না, কিছুই করছে না।
- অবরুদ্ধ হোক বা স্থগিত করা হোক না কেন, মৃত্যুদণ্ড এখনও চালিয়ে যাওয়ার আগে করুটিনের ফলাফলের জন্য অপেক্ষা করছে৷
পরবর্তী পাঠ শুরু করুন:
এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।