1. Mobil qurilmalar uchun dasturlar Ishlab chiqish muhiti


Mavzu: Komponentning hayotiy davrlari. Ilova shabloni



Download 27,79 Mb.
bet6/18
Sana24.09.2022
Hajmi27,79 Mb.
#850101
1   2   3   4   5   6   7   8   9   ...   18
Bog'liq
Amaliyot mobil qurulmalarni dasturlash

Mavzu: Komponentning hayotiy davrlari. Ilova shabloni 
Reja:
1. Android Jetpack
2. Ilova shabloni 
Android Jetpack - bu kodni yaxshilaydigan, takroriy kodlarni kamaytiradigan va Android versiyalarida izchil ishlaydigan ishlab chiquvchilar kutubxonalari to'plami. Android Jetpack Arxitektura Komponentlari Faoliyat yoki Fragmentning hayot aylanishiga asoslangan ilovada komponentlar yaratish vositalarini taqdim etadi.
Ushbu maqolada siz AwarenessFood ilovasida hayot aylanishidan xabardor komponent yaratasiz . Komponent tarmoq ulanishidagi o'zgarishlarni boshqaradi. Shuningdek , Faoliyatda tarmoq holatini yangilash uchun hayot tsikli egasini yaratasiz .
Ilovaning o'zi foydalanuvchiga tasodifiy retseptni ko'rsatadi va ikkita variantga ega: yangi tasodifiy retseptni olish, oziq-ovqat bilan bog'liq tafsilotlarni ko'rsatish. Tarmoq uzilganda, ilovaning asosiy ekranida xabar va kechiktirish tugmasi bilan SnackBar paydo bo'ladi.
Ushbu maqolada siz quyidagilarni o'rganasiz:
Android komponentlaridagi hayot davrlari
Hayotiy tsikldan xabardor komponentlar
Hayotiy tsikl kuzatuvchilari
Hodisalar va holatlar
Hayotiy davr egalari
Lifecycle-dan xabardor komponentlarni qanday sinab ko'rish mumkin
LiveData komponenti
Ushbu maqolada siz Android-ni ishlab chiqish asoslari bilan tanishsiz deb taxmin qilinadi. Agar yo'q bo'lsa , Android boshlanuvchilar uchun qo'llanmani ko'rib chiqing .
Boshlash
Asl maqoladan materialni yuklab oling ( bu yerda sahifaning yuqori qismidagi Yuklab olish tugmasi ). Android Studio 4.2.1 yoki undan yuqori versiyasini oching va loyihani import qiling.
Quyida loyihadagi har bir paket nima qilishi haqida umumiy ma’lumot berilgan:
ilovadagi voqealarni kuzatish uchun analitik darslar
ma'lumotlar modeli sinflari
di qaramlikni qo'llab-quvvatlash
monitor tarmoq ulanishining holatini kuzatuvchi bitta sinfni o'z ichiga oladi
tashqi API larga kirish uchun tarmoq sinflari
doimiy saqlashga kirish uchun omborlar sinflari
viewmodels biznes mantig'i
ekranlarni ko'rish
Sponacular API ro'yxati
AwarenessFood ilovasi retseptlarni spoonacular API orqali oladi . Ilova to'g'ri ishlashi uchun u erda ro'yxatdan o'tishingiz kerak.
O'tish spoonacular.com va yangi qayd yozuvini yaratish. Hisob qaydnomangizni tasdiqlaganingizdan so'ng, shaxsiy hisobingizga o'ting va u erda API kalitini qidiring. Uni nusxalang , di paketidagi RecipesModule.kt faylini oching va quyidagi qatordagi kalitni almashtiring:
private const val API_KEY = "YOUR_API_KEY_HERE"
Kompilyatsiya qiling va ishga tushiring. Tasodifiy retsepti bo'lgan ekran paydo bo'lishi kerak, shunga o'xshash:

Boshqa tasodifiy retseptni yuklash uchun Qayta yuklash tugmasini bosing . Agar siz qurilmadagi Internetni o'chirib, yangi retseptni olishga harakat qilsangiz, quyidagi rasmda bo'lgani kabi xato va takrorlash tugmasi bilan SnackBar paydo bo'ladi:

Tafsilotlar ekraniga o'tish uchun Qo'shimcha menyu elementini bosing Oziq-ovqat trivia . Bu funksiyani keyinroq qo‘shasiz. Endi bu shunchaki tugmachali ekran:

Bu loyihani sozlashni yakunlaydi. Siz endi hayot tsiklidan xabardor bo'lgan komponentlar bilan tanishishga tayyorsiz .


Androidda hayot sikllari
Android ishlab chiqaruvchisi uchun muhim asosiy narsa bu Faoliyat va Fragmentning hayot aylanishi qanday ishlashini tushunishdir. Hayotiy tsikl - bu Faoliyat yoki Fragment holati o'zgarganda, ma'lum tartibda qo'ng'iroqlar seriyasidir.
Hayotiy tsikl zarur tushunchadir, chunki siz Faoliyat va Fragmentning muayyan holatlarida nima qilish kerakligini tushunishingiz kerak. Masalan, tartibni moslashtirish -da sodir bo'ladi Activity.onCreate(). Fragmentda usul tartibni o'rnatish uchun javobgardir Fragment.onCreateView(). Yana bir misol, bir usulda geolokatsiyani o'qish imkonini beradi onStart().
R esurslarni bo'shatish uchun geolokatsiyani o'qishni o'chirib qo'yish kerak onStop(); boshqa resurslar va komponentlar ham shu yerda chiqariladi. Muhim nuqta: hayot tsiklining barcha qo'ng'iroqlari har doim ham bajarilmaydi. Masalan, operatsion tizim usulni chaqirishi yoki chaqirmasligi mumkin onDestory().
Faoliyatning hayot aylanishi:

Faoliyatning hayot aylanishi haqida koʻproq maʼlumot olishni istaganlar uchun Kotlin bilan Android faoliyatiga kirish ni koʻrib chiqing .
Fragmentning hayot aylanishi:

Frament Lifecycle haqida chuqur maqola - Android Fragments Tutorial: An Introduction with Kotlin .


Biz hayot tsiklidagi o'zgarishlarga javob beramiz
Aksariyat ilovalar Faoliyat yoki Fragmentning hayot aylanishi hodisalariga javob berishi kerak bo'lgan bir nechta komponentlarga ega. Siz ularni usulda ishga tushirishingiz yoki ro'yxatdan o'tishingiz kerak va usulda onStart()bepul resurslar onStop().
Ushbu yondashuv bilan sizning kodingiz chalkash va xatoga moyil bo'lishi mumkin. Usullar ichidagi kod onStart()va onStop()cheksiz o'sishda davom etadi. Shu bilan birga, noto'g'ri hayot tsikli hodisasida komponentdan obunani bekor qilishni yoki komponent usulini chaqirishni unutish oson, bu xatolar, xotiraning oqishi va ilovalarning ishdan chiqishiga olib kelishi mumkin.
Ushbu muammolarning ba'zilari hozir ilovada. Loyihada NetworkMonitor.kt faylini oching . Bu sinf tarmoq holatini tinglaydi va bu haqda Faoliyatga xabar beradi.
Eslatma: Tarmoqqa ulanishni kuzatish bo'yicha batafsil ma'lumotni bu erda topishingiz mumkin - Tarmoq holatini o'qing .
NetworkMonitorFaoliyat ishga tushirilgan paytdan boshlab namuna mavjud bo'lishi kerak. MainActivity.kt ni va onCreate()tarmoq monitorining qo'ng'iroq orqali ishga tushirilgan usulini oching networkMonitor.init().
Keyin NetworkMonitorqo'ng'iroq onStart()orqali usulda qayta qo'ng'iroqni qayd qiladi networkMonitor.registerNetworkCallback(). Nihoyat, faoliyati namuna usuli qayta qo'ng'iroq obunani bekor onStopchaqirilib networkMonitor.unregisterNetworkCallback().
Komponentni ishga tushirish, qayta qo'ng'iroq orqali voqealarga obuna bo'lish va voqealarga obunani bekor qilish Faoliyatga juda ko'p qo'shimcha kod qo'shadi. Bundan tashqari, faqat foydalanish onStartva onStopusullarni chaqirish NetworkMonitor.
U erda MainActivityfaoliyat hayot aylanishi bog'liq ishlatiladigan faqat bitta komponent hisoblanadi. Kattaroq va murakkabroq loyihalarda bu komponentlar ko'p va bu butunlay chalkashlikka olib kelishi mumkin.
Biz hayot aylanishi komponentlaridan foydalanamiz (Lifecycle-Aware)
NetworkMonitor Faoliyatning hayot aylanish holatiga qarab turli xil amallarni bajaradi. Boshqa so'zlar bilan aytganda, NetworkMonitor bir bo'lishi kerak Hayot usuli-xabardor komponentini bizning holatda u - o'z ota-hayot aylanishi o'zgarishlar va javob MainActivity.
Android Jetpack hayot aylanishidan xabardor komponentlarni yaratish uchun sinflar va interfeyslarni taqdim etadi. Ulardan foydalanib, siz ishlashingizni yaxshilashingiz mumkin NetworkMonitor. U ota-ona faoliyatining joriy hayot tsikli holati asosida avtomatik ravishda ishlaydi.
A Hayot usuli egasi bunday faoliyat yoki Fragment sifatida hayot tsikli bilan bir qismidir. Hayotiy tsikl egasi hayot tsikli voqealarini tinglaydigan barcha komponentlarni bilishi kerak. Observer sxemasi ushbu muammoni hal qilishning eng yaxshi usuli hisoblanadi.
Hayotiy tsikl kuzatuvchisini yaratish
Ota-onasining hayot aylanishi holatlarini tinglash va ularga munosabat bildira oladigan komponentning hayot aylanishi kuzatuvchisi. Jetpack-da buning uchun maxsus interfeys mavjud - LifecycleObserver.
Xo'sh, endi o'zimizni yaxshilash vaqti keldi NetworkMonitor. NetworkMonitor.kt ni oching va sinfga interfeys yordamini qo'shing LifecycleObserver:
class NetworkMonitor
@Inject constructor(private val context: Context) : LifecycleObserver {
// Code to observe changes in the network connection.
}
Hammasi shu, endi u hayot aylanishini kuzatuvchisi. Siz hozirgina NetworkMonitorhayot aylanishidan xabardor komponent bo'lish yo'lida birinchi qadamni qo'ydingiz .
Hayotiy tsikl hodisalari va holatlari
Sinf Lifecycleota-onaning hayot aylanishi holatini biladi va uni har qanday tinglovchiga uzatadi LifecycleObserver.
LifecycleHayotiy tsikl ma'lumotlarini uzatish uchun ikkita raqamdan foydalanadi: Voqea va holat .
Voqealar
Event Operatsion tizim yuboradigan hayot tsikli hodisalarini ifodalaydi:
ON_CREATE
ON_START
ON_RESUME
ON_PAUSE
ON_STOP
ON_DESTROY
ON_HANY
Har bir qiymat umrbod qayta qo'ng'iroqning ekvivalentidir. ON_ANYhar bir hodisaga yuborilishi bilan farq qiladi (barcha hodisalarni boshqarish uchun bitta usulni yaratishingiz mumkin).
Hayotiy tsikl voqealariga javob berish
Endi NetworkMonitoru LifecycleObserver , lekin u hali hayot aylanishiga javob bermaydi. Usulga izoh qo'shishingiz kerak, @OnLifecycleEventshunda u ma'lum bir hodisaga javob bera boshlaydi.
@OnLifecycleEventQuyidagi kabi kerakli usullarga qo'shing :
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun init() {
// ...
}

@OnLifecycleEvent(Lifecycle.Event.ON_START)


fun registerNetworkCallback() {
// ...
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)


fun unregisterNetworkCallback() {
// ...
}
Bu holda, usul init()javob ON_CREATEtadbir, va , deyiladi registerNetworkCallback()haqida ON_STARTva Voqeani .ON_STOPunregisterNetworkCallback()
Shunday qilib, NetworkMonitorendi hayot aylanishiga o'zgartirishlar kiritilmoqda, endi biz kodni biroz tozalashimiz kerak. MainActivity.kt ga endi quyidagi kod kerak emas , chunki bu harakatlar NetworkMonitoro'z-o'zidan amalga oshiriladi:
override fun onCreate(savedInstanceState: Bundle?) {
// ...
// 1.Network Monitor initialization.
networkMonitor.init()
// ...
}

// 2. Register network callback.


override fun onStart() {
super.onStart()
networkMonitor.registerNetworkCallback()
}

// 3. Unregister network callback.


override fun onStop() {
super.onStop()
networkMonitor.unregisterNetworkCallback()
}
O'chirish onStart()va butunlay onStop(). Bundan tashqari, uni networkMonitor.init()usuldan olib tashlash kerak onCreate().
Ushbu kod o'zgarishlarini amalga oshirish orqali siz faollikdan resurslarni ishga tushirish, ro'yxatdan o'tkazish va bo'shatish mas'uliyatini komponentning o'ziga o'tkazdingiz.
Shtatlar
Statehayot aylanishi egasining joriy holatini saqlaydi. Mumkin qiymatlar:
BOSHLANGAN
YARATILGAN
BOSHLANGAN
DAVOM ETILGAN
YO'Q QILGAN
Hayotiy tsikl holatlari ma'lum bir voqea sodir bo'lganligini bildiradi.
Misol tariqasida, biz voqeada komponentni uzoq davom etadigan ishga tushirishni boshlaymiz ON_STARTva Faoliyat (yoki Fragment) ishga tushirish tugaguniga qadar yo'q qilinadi, deylik. Bunday holda, komponent voqea bo'yicha hech qanday harakat qilmasligi kerak ON_STOP, chunki u ishga tushirilmagan.
Hodisalar va hayot aylanish holatlari o'rtasida bevosita bog'liqlik mavjud. Quyidagi diagramma bu munosabatni ko'rsatadi:

Ushbu shartlar quyidagi hollarda yuzaga keladi:
INITIALIZED: Faoliyat yoki Fragment allaqachon yaratilgan, lekin onCreate()hali chaqirilmaganda. Bu hayot tsiklining dastlabki holati.
YARATILGAN: keyin ON_CREATEva keyin ON_STOP.
BOSLANGAN: keyin ON_STARTva keyin ON_PAUSE.
DAVOM ETILGAN: faqat dan keyin ON_RESUME.
YO'Q ETILGAN: keyin ON_DESTROY, lekin qo'ng'iroqdan oldin onDestroy(). Holat ga aylangandan DESTROYEDso'ng, Faoliyat yoki Fragment endi hodisalarni jo'natmaydi.
Hayotiy tsikl holatidan foydalanish
Ba'zan komponentlar, agar ularning ota-onasi hech bo'lmaganda ma'lum bir holatda bo'lsa, kodni bajarishi kerak. Hayotiy tsiklning to'g'ri vaqtida NetworkMonitorbajarayotganingizga ishonch hosil qilishingiz kerak registerNetworkCallback().
LifecycleKonstruktorga argument qo'shing NetworkMonitor:
private val lifecycle: Lifecycle
Uning yordamida siz NetworkMonitorota-onaning hayot aylanishi holatiga kirishingiz mumkin bo'ladi.
Shundan so'ng kodga registerNetworkCallback()shart qo'shing :
fun registerNetworkCallback() {
if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
// ...
}
}
Ushbu shart bilan, u NetworkMonitortarmoq holatini kuzatishni boshlaydi, agar hayot aylanishi holati -dan kam bo'lmasa STARTED. Bu juda qulay, chunki komponentdagi kod tugagunga qadar hayot aylanishi o'zgarishi mumkin. Ota-onaning holatini bilish komponentdagi buzilishlar, xotiraning oqishi va holat poygalarining oldini oladi.
Shunday qilib, oching MainActivity.ktva quyidagini o'zgartiring NetworkMonitor:
networkMonitor = NetworkMonitor(this, lifecycle)
NetworkMonitorEndi menda ota-ona hayot tsikliga kirishim bor va tarmoqni tinglash faqat Faoliyat kerakli holatda bo'lganda boshlanadi.
Hayotiy tsikl voqealariga obuna
O'zgarishlarga NetworkMonitoramalda javob berishni boshlash uchun uning ota-onasi NetworkMonitorvoqea tinglovchisi sifatida ro'yxatdan o'tishi kerak . In MainActivity.ktusuli quyidagi qatorlarni qo'shish onCreate()butlovchi bo'lganingizdan so'ng:
lifecycle.addObserver(networkMonitor)
Hayotiy tsikl egasi endi NetworkMonitoro'zgarishlar haqida xabar beradi. Xuddi shu tarzda, hayot aylanishi voqealarini tinglash uchun boshqa komponentlarni qo'shishingiz mumkin.
Bu ajoyib yaxshilanish. Bitta qator kod bilan komponent ota-onadan hayot tsikli voqealarini oladi. Endi siz Faoliyat yoki Fragmentda qozon kodini yozishingiz shart emas. Bundan tashqari, komponent barcha ishga tushirish va konfiguratsiya kodlarini o'z ichiga oladi, bu uni mustaqil va sinovdan o'tkazishga imkon beradi.
I lovani yarating va qayta ishga tushiring. Retseptlarni yuklaganingizdan so'ng, "Samolyot rejimi" ni yoqing. Siz avvalgidek SnackBar-da tarmoq xatosini ko'rasiz:

Biroq, ichki amaliyot ancha yaxshilandi.


Hayotiy tsikl kimga tegishli?
Hammasi yaxshi ko'rinadi, lekin ... hayot aylanishi kimga tegishli? Nima uchun Faoliyatning o'zi ushbu misoldagi hayot aylanishiga ega? Boshqa egalari bormi?
Hayot usuli egasi ekanligini amalga interfeysi bir qismi hisoblanadi LifecycleOwner. Bu siz amalga oshirishingiz kerak bo'lgan yagona usul: Lifecycle.getLifecycle(). Ma'lum bo'lishicha, ushbu interfeysni qo'llab-quvvatlaydigan har qanday sinf hayot tsiklining egasi bo'lishi mumkin.
Androidda hayot aylanishini qo'llab-quvvatlaydigan o'rnatilgan komponentlar mavjud. Faoliyat uchun u ComponentActivity( AppCompatActivityinterfeys uchun asosiy sinf va uni amalga oshiradi LifecycleOwner).
Biroq, boshqa qo'llab-quvvatlanadigan sinflar mavjud LifecycleOwner. Masalan, Fragmentbu LifecycleOwner. Bu shuni anglatadiki Fragment, agar kerak bo'lsa , kodni istalgan ga ko'chirishingiz mumkin va u bilan bir xil ishlaydi MainActivity.
Fragmentning hayot aylanishi uning tarkibidagi vizual komponentlar (UI) siklidan sezilarli darajada uzoqroq bo'lishi mumkin. Agar kuzatuvchi Fragmentdagi UI bilan o'zaro aloqada bo'lsa, bu muammolarga olib kelishi mumkin, chunki kuzatuvchi UIni ishga tushirishdan oldin yoki yo'q qilingandan keyin o'zgartirishi mumkin.
Bu erda nima sabab viewLifecycleOwnerbilan Fragment. Siz viewLifecycleOwnerqo'ng'iroqdan keyin onCreateView()va undan oldin foydalanishingiz mumkin onDestroyView(). Hayotiy tsikl yo'q qilingandan so'ng, u hodisalarni jo'natmaydi.
Fragment viewLifecycleOwnerbilan ishlashda keng tarqalgan foydalanish holati LiveData. FoodTriviaFragment.kt ni oching va onViewCreated()oldingi usulga viewModel.getRandomFoodTrivia()quyidagi kodni qo'shing :
viewModel.foodTriviaState.observe(viewLifecycleOwner, Observer {
handleFoodTriviaApiState(it)
})
Bundan tashqari, sinf importini qo'shishingiz kerak bo'ladi import androidx.lifecycle.Observer.
Ushbu koddan foydalanish (is ) FoodTriviaFragmentdan kelgan voqealarga munosabat bildiradi . Fragment hayot aylanishining ( ) egasi bo'lgani uchun kuzatuvchi faqat Fragment faol bo'lganda ma'lumotlar yangilanishini oladi.foodTriviaStateLiveDataviewLifecycleOwner
Ilovani yaratish va ishga tushirish vaqti keldi. Menyuda " Ko'proq " tugmasini bosing va " Food Trivia" ni tanlang . Endi ilovangizda qiziqarli va qiziqarli taomlar haqida maʼlumot olishingiz mumkin.

ProcessLifecycleOwner-dan foydalanish
Ba'zi hollarda komponent dasturning o'zi hayotiy tsiklidagi o'zgarishlarga javob berishi kerak. Masalan, ilova qachon fonga o'tib, oldingi planga qaytishini kuzating. Bunday holatlar uchun Jetpack-da interfeysni tabiiy ravishda amalga oshiradigan ProcessLifecycleOwner mavjud LifecycleOwner.
Bu sinf butun dastur jarayonining hayot aylanishini ifodalaydi. Voqealar ON_CREATEdastur boshlanganda faqat bir marta yuboriladi. Bunday holda, hodisa ON_DESTROYumuman yuborilmaydi.
ProcessLifecycleOwnerhodisalarni yuboradi ON_STARTva ON_RESUMEbirinchi Faoliyat bu holatlardan o'tganda. Nihoyat, u ProcessLifecycleOwnerhodisalarni jo'natadi ON_PAUSEva ON_STOPshundan so'ng ilovaning oxirgi ko'rinadigan Faoliyati tegishli holatlardan o'tadi.
Bu oxirgi ikki hodisa ma'lum bir kechikishdan keyin sodir bo'lishini bilish muhimdir. ProcessLifecycleOwnerbu o'zgarishlarning sababiga ishonch hosil qilish kerak. U hodisalarni yuboradi ON_PAUSEva ON_STOPagar dastur konfiguratsiya o'zgarishi tufayli emas, balki fonga o'tgan bo'lsa.
Bunday hayot aylanishi egasidan foydalanganda komponent interfeysni ham qo'llab-quvvatlashi kerak LifecycleObserver. Analitika paketida AppGlobalEvents.kt ni oching . Bu nima ekanligini ko'rish mumkin .LifecycleObserver
Sinf ilovaning qachon oldinga chiqishi yoki fonga o'tishini kuzatib boradi. Bu hayot tsikli egasi voqealarni yuborganda sodir bo'ladi ON_STARTva ON_STOP.
Buni ro'yxatdan o'tkazish LifecycleObserverbiroz boshqacha sodir bo'ladi. RecipesApplication.kt ni oching va usulga quyidagi kodni qo'shing onCreate():
ProcessLifecycleOwner.get().lifecycle.addObserver(appGlobalEvents)
Bu erda biz misol olamiz ProcessLifecycleOwnerva uni appGlobalEventsvoqea tinglovchisi sifatida qo'shamiz .
Ilovani yarating va ishga tushiring. Ilovani ishga tushirgandan so'ng, uni fonga kamaytiring. Agar siz LogCatchiqishni APP_LOGGER tegi boʻyicha ochsangiz va filtrlasangiz, quyidagi xabarlarni koʻrishingiz kerak:

Shunday qilib, siz Fragment, Activity va Application komponentlari interfeysni qanday amalga oshirishini ko'rdingiz LifecycleOwner. Lekin bu hammasi emas. Endi siz xuddi shunday qiladigan o'z sinflaringizni qanday yaratishni o'rganasiz.
O'zingizning hayot tsiklingiz egasini yarating
Esda tutingki, har qanday sinf interfeysni qo'llab-quvvatlashi mumkin LifecycleOwner. Bu siz shaxsiy hayot aylanishi egasini yaratishingiz mumkinligini anglatadi.
Keling, smartfon tarmoqqa ulanishni yo'qotgandan so'ng hayot aylanishi boshlanadigan va ulanish tiklanganda tugaydigan egani yarataylik.
Monitor paketida UnavailableConnectionLifecycleOwner.kt ni oching va sinf interfeysni qo'llab-quvvatlashi uchun o'zgartirishlar kiriting :LifecycleOwner
@Singleton
class UnavailableConnectionLifecycleOwner @Inject constructor() : LifecycleOwner {
// ...
}
Shundan so'ng, kiritish LifecycleRegistryuchun UnavailableConnectionLifecycleOwner :
private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)

override fun getLifecycle() = lifecycleRegistry


Sinf LifecycleRegistry- bu Lifecyclebir nechta kuzatuvchilar bilan ishlay oladigan va hayot tsiklidagi har qanday o'zgarishlar to'g'risida ularga xabar beradigan dastur.
Voqealarni qo'shish
Hayotiy tsikl voqealarini xabardor qilish uchun usuldan foydalanishingiz mumkin handleLifecycleEvent(). Keling, sinfimizga bir nechta usullarni qo'shamiz:
fun onConnectionLost() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}

fun onConnectionAvailable() {


lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
}
Smartfon tarmoqqa ulanishni yo'qotgan lifecycleRegistrytaqdirda, u ON_STARTbarcha kuzatuvchilarga voqea yuboradi . Ulanish qayta paydo bo'lganda, u lifecycleRegistryyuboradi ON_STOP.
Nihoyat, quyidagi kodni qo'shing:
fun addObserver(lifecycleObserver: LifecycleObserver) {
lifecycleRegistry.addObserver(lifecycleObserver)
}
addObserver()hayot aylanishi tinglovchisini ro'yxatdan o'tkazadi UnavailableConnectionLifecycleOwner.
Voqealarga munosabat
Endi MainActivity.kt-ni oching va ushbu kod qatorini qo'shing:
unavailableConnectionLifecycleOwner.addObserver(networkObserver)
Shundan so'ng, u networkObservervoqealarga munosabat bildiradi unavailableConnectionLifecycleOwner. NetworkObserverqurilma tarmoqni yo‘qotganda SnackBar-ni ko‘rsatadi va tarmoq tiklanganda SnackBar-ni yashiradi.
Nihoyat, almashtiring handleNetworkState():
private fun handleNetworkState(networkState: NetworkState?) {
when (networkState) {
NetworkState.Unavailable -> unavailableConnectionLifecycleOwner.onConnectionLost()
NetworkState.Available -> unavailableConnectionLifecycleOwner.onConnectionAvailable()
}
}
Ushbu kod voqealarni ishga tushiradi unavailableConnectionLifecycleOwner.
Ilovangizni yaratish va ishga tushirish vaqti keldi. Hammasi avvalgidek ishlaydi, faqat tarmoq monitoringi bundan mustasno, bu yerda biz hozir lifecycleOwnertarmoq holatini boshqarish uchun moslashtirilgandan foydalanamiz .
Keyingi bo'limda siz hayot aylanishi komponentlarini qanday sinab ko'rishni o'rganasiz.
Hayotiy tsikl komponentlarini sinovdan o'tkazish
NetworkMonitorBizda hayot aylanishi komponentidan foydalanish yana bir afzalliklarga ega - biz kodni barcha bog'liq hayot tsikli hodisalari bilan sinab ko'rishimiz mumkin.
Ushbu testlar NetworkMonitorhayot tsikli egasining holatiga ko'ra to'g'ri usul chaqirilganligini tekshiradi . Sinov yaratish uchun siz shaxsiy hayot aylanishi egasini yaratishdagi kabi amallarni bajarasiz.
Sinovni sozlash
NetworkMonitorTest.kt ni oching . Sinovni o'tkazish uchun siz hayot tsikli egasini masxara qilishingiz va NetworkMonitor. Sinov sinfingizga ikkita stub qo'shing:
private val lifecycleOwner = mockk(relaxed = true)
private val networkMonitor = mockk(relaxed = true)
U MockK kutubxonasining {: target = " _blank "} funksiyasidan foydalanadi , bu sizga sinfni amalga oshirishni simulyatsiya qilish imkonini beradi. Argumentda relaxedaytilishicha, stublar o'zlarining xatti-harakatlarini aniqlamasdan ishlashi mumkin.
Shundan so'ng, o'zgaruvchini yarating:
private lateinit var lifecycle: LifecycleRegistry
Ushbu kod LifecycleRegistrykuzatuvchilarni boshqarish va ularga hayot aylanish jarayonini jo'natish uchun ob'ektni testga qo'shadi .
Nihoyat, usulga quyidagi kod qatorini qo'shing setup():
lifecycle = LifecycleRegistry(lifecycleOwner)
lifecycle.addObserver(networkMonitor)
Bu erda ro'yxatga olish kitobi ishga tushiriladi LifecycleRegistry, unga hayot aylanishi egasining stub'i uzatiladi va NetworkMonitorvoqealarni tinglash uchun kuzatuvchi qo'shiladi .
Testlarni qo'shish
To'g'ri usul chaqirilganligiga ishonch hosil qilish NetworkMonitoruchun hayot aylanishi reestri to'g'ri holatni o'rnatishi va tinglovchilarni xabardor qilishi kerak. Buning uchun usul qo'llaniladi handleLifecycleEvent().
Birinchi sinov ON_CREATEusulning hodisada chaqirilganligini tekshiradi init().
Keling, test yozamiz:
@Test
fun `When dispatching On Create lifecycle event, call init()`() {
// 1. Notify observers and set the lifecycle state.
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)

// 2. Verify the execution of the correct method.


verify { networkMonitor.init() }
}
Yuqoridagi kodda siz:
Avval siz davlatni o'rnatasiz ON_CREATE
Shundan so'ng, siz usuli deb atalgan tekshiring init() yilda NetworkMonitor.
Bog'liqlarni import qilishni unutmang:
import androidx.lifecycle.Lifecycle
import io.mockk.verify
import org.junit.Test
Sinovni bajaring, u muvaffaqiyatli bo'ladi.
Endi voqeani tekshiramiz ON_START, u usulni chaqirishi kerak registerNetworkCallback():
@Test
fun `When dispatching On Start lifecycle event, call registerNetworkCallback()`() {
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START)

verify { networkMonitor.registerNetworkCallback() }


}
Ushbu kod ON_STARTvoqeani tekshiradi .
Sinov muvaffaqiyatli o'tishi kerak.
Va nihoyat, keling, hodisani sinab ko'rish ON_STOPva usulni chaqirish uchun test yarataylik unregisterNetworkCallback():
@Test
fun `When dispatching On Stop lifecycle event, call unregisterNetworkCallback()`() {
// 1. Notify observers and set the lifecycle state.
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP)

// 2. Verify the execution of the correct method.


verify { networkMonitor.unregisterNetworkCallback() }
}
Ushbu kod ON_STOPvoqeani tekshiradi .
Sinovni ishga tushiring va ... xato bilan ishdan chiqadi Tekshirish muvaffaqiyatsiz tugadi: 1-dan 1-ga qo'ng'iroq qiling: NetworkMonitor (# 2) .unregisterNetworkCallback ()) chaqirilmadi. Bu unregisterNetworkCallback()voqea muvaffaqiyatsiz bo'lganligini anglatadimi ON_STOP? Sinov kodi voqeani yuboradi ON_STOP, lekin uning oldida voqea bo'lishi kerak ON_START.
ON_STARTSinovga hodisa qo'shing :
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START)
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
Endi sinov muvaffaqiyatli o'tdi.
Shunday qilib, biz hayot tsiklining barcha hodisalarini tekshirdik va ular kerakli usullarni NetworkMonitor.
LiveData: hayot aylanishi komponenti
Hozirgacha siz o'zingizning hayot aylanish komponentingizni qanday yaratishni o'rgandingiz. Ammo Android-da xuddi shunday tayyor komponentlar mavjudmi? Albatta, ulardan eng mashhuri LiveData .
Ish printsipi LiveDatajuda oddiy. Bu kuzatilishi mumkin bo'lgan ma'lumotlar ombori, ya'ni u ma'lumotlarni saqlashi va ma'lumotlar o'zgarganda tinglovchilarni xabardor qilishi mumkin. Shu bilan birga, LiveDatau hayot tsikli komponentidir, ya'ni u o'z kuzatuvchilarini faqat hayot tsikli faol bo'lganda xabardor qiladi.
Kuzatuvchi faol holatda bo'ladi, agar uning hayotiy tsikli STARTEDyoki holatida bo'lsa RESUMED. Agar hayot aylanishi boshqa holatda bo'lsa, LiveDatau tinglovchilarni o'zgarishlar haqida xabardor qilmaydi.
LiveData o'zgaruvchilarini yaratish va tayinlash
Open MainViewModel.kt dan viewmodels to'plami . U erda quyidagi o'zgaruvchilarni qo'shing:
private val _loadingState = MutableLiveData()
val loadingState: LiveData
get() {
return _loadingState
}
_loadingStatebu LiveDataikkita mumkin bo'lgan qiymat bilan: Loadingva NotLoading. Ushbu qiymatlar foydalanuvchi interfeysiga yuklashni ko'rsatish yoki yashirishni aytadi ( ProgressBar).
Har safar LiveDatao'zgaruvchi yangi qiymatni olganida, u o'z tinglovchilarini o'zgarishlar haqida xabardor qiladi. Yangi qiymatni o'rnatish uchun qiymat maydonidan foydalaning .
Keling, usulni o'zgartiraylik getRandomRecipe():
fun getRandomRecipe() {
_loadingState.value = UiLoadingState.Loading
viewModelScope.launch {
recipeRepository.getRandomRecipe().collect { result ->
_loadingState.value = UiLoadingState.NotLoading
_recipeState.value = result
}
}
}
Yangilanish endi valuebarcha tinglovchilarga yuboriladi _loadingState.
LiveData o'zgarishlarini kuzatish
MainActivity.kt ni oching va usulga kod qo'shing onCreate():
viewModel.loadingState.observe(this, Observer { uiLoadingState ->
handleLoadingState(uiLoadingState)
})
Bu yerda MainActivityyangilanishlarni tomosha qilishni boshlaydi viewModel.loadingState. Ko'rib turganingizdek, birinchi argument observe()hisoblanadi this, hozirgi holat ekanligini, MainActivity. Usul imzosini observe()ko'rib chiqing, birinchi argument turi ekanligini ko'rishingiz mumkin LifecycleOwner. Bu shuni anglatadiki, kuzatuvchilar LiveDatao'zgarishlarga Faoliyatning hayotiy tsiklining holatiga qarab munosabatda bo'lishadi. Usul imzosini ochish uchun Control - yoki Buyruq- ni bosing.
Usul observe()quyidagi kodga ega:
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
Ko'rinib turibdiki, agar LifecycleOwnerholatda DESTROYEDva o'zgaruvchi uchun yangi qiymat o'rnatilgan bo'lsa, kuzatuvchi yangilanishni olmaydi.
Biroq, agar LifecycleOwneru yana faollashsa, kuzatuvchilar avtomatik ravishda oxirgi qiymatni oladilar .
Loyihani yarating va ishga tushiring. Ilova yuklanayotganda dastur taraqqiyot satrini ko'rsatadi, tugagandan so'ng, bajarilish paneli yashiriladi.

Download 27,79 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   18




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©www.hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish