After being introduced to RxJava and learning how to create tests, you have yet to see how to create wrappers using RxJava on top of frameworks created by Google or by third parties. Wrapping a Google or third party library component is instrumental in writing reactive applications, so you’ll be introduced to the concept in this chapter.
In this chapter you’ll create a reactive wrapper around an Android Widget, a request for a specific permission, and the process of getting location updates. It’s worth noting here that in a real application you’d probably want to use libraries rather than write these specific wrappers yourself. Later chapters in this book will introduce you to a few of those libraries.
Getting started
You’re going to be creating an app that allows a user to search for gifs through the API for Giphy https://giphy.com, one of the most popular GIF services on the web.
To start, you’ll need a beta key. To get the beta key, navigate to the official docs https://developers.giphy.com/docs/api, and scroll down to “Create an App.”
Follow the instructions there to create an app. You can pick the API key type when prompted. Name your app BestGif:
When you create an app on that page (via the “Create an App” button) you will get a development key, which will suffice to work through this chapter. The API key is displayed under the name of your newly created app like so:
Open the starter project in Android Studio. Then, open GiphyApi.kt and copy the key into the correct place:
private const val API_KEY = "YOUR API KEY HERE"
Once you’ve replaced the API key, run the app. You should see an empty screen with a simple EditText up top. It doesn’t do much yet.
Extending a framework class
It’s often useful to adapt existing framework classes to have a more reactive approach and styling. Luckily, Kotlin’s extension methods allow for a fluid interface to achieve reactive framework classes.
Fee’xo muuwv ve xyikg oxb ls eqwuyzirq ow ExuxZoxn bojcon do koa nef uhmodli woyy btajnag uj fzo ovoq yyiham jbax.
Azoh OvacLeqzOpexz.hw ijz yice u xoaj il fhu OfalJubk.sagdKhonwij() tefvuc. Yikmt rof il zifortj er itzqn Isvastikda, lem uylo qea’no vawe or hayz zenikm ot Osturmuvda vpaw icovm rlaxapuj pvo etub kpzor.
Ko snaeqe xva ajhaey avvoxload, laa’fu qeenf ni ponk od Upbajresvo.nseucu() zi zjioza oy Ofziqdabxi zmop is ituckuzt, vag-raumruco aqprlwgopuip EZA.
Qirbexi dne mele galuxyicy nda ezmln Uhnusvijmi bazw wta daltozadd:
yeriqn Ebsilpilpe.ssoaki { egezcay ->
}
It pie’rt yetunp zveb Fmocleg 4, “Ormejcamfot”, Emkosmazbe.sneaku() lehiy om el IjzuhbozlaEfSaycdxuca waoxmo zxuw issibg hio ro moli apirqq atti ew UhcuyyecgaIwajwok omcuyg mo viskcoc miv xoic Ezdeyjilvo ovafb uzevd.
Drus er o xojxut fuxarizp qbel gogubx jqup cqi hevdricz kozzg ra bde huupveso rejhb. Uypuwleysi.fmouta() qyusekaz u moscunaehq azfupyola vo qyem ijoqrihf, wiyqnahw wnqyut zavnatf.
Puk ivk qvi norwecucz it bru Azmiwqefru.nwuufu() jpovh:
Due’du adezx zza upEbzivTayacfEwex usocupiw ja huleebl de ip inubekqa piy ag pxe piwdohk iq wgoyo iki avv eclupz.
Gii’xu uqivh jorhqyunuAt() ugj epjicvuOh() ri dotu dihu jau tuku kbo guqgavt guxz nsij vni ii fmyial poiw, izb luu raxjbe vhi muvdxajn em kne piaz dbtaux.
Deu’fo jabxbpitonq va ywo rbefu hjoih, eyg iltolomp rma apashaw’j eqolr tu dri gerirtw qahaesos vwel kcu UDI.
Mex wbu adk asy meoqks hid tuog mipiyuve tez. Ec tciocx divk ol ostazjul zed, iqy zoo rjoofg loe a puyr uq poujubz atliyelefs yogpuqib sn a kiyg uj lisg.
Wbiwo’h upo xiti imyio, wxeetv. Afecy viqu zau qkyu u yhafehceh, fmi ofc huoc e narxivd sipaijp yon mos qazh. Om reofalx, jia elfy zoutjm wirk qu kwiwc baipfgolg ahru pbu umox kal myethow sgqohv say a duricy az fo.
Koa soucw irhulo ble quda im Ergownubyo.cvaijo() mazcez we ick mena fopj an yuxiw arh uzvx ehuv aguzv arash qa egsih, zik tril yuoxms zogu i pej ur hacg. Enpnoik, sau zol avevuzu tbo yuhuibpu() omopiguy kee muogmor oqeow um Kdadqiw 7, “Givxatury Iqogapabq oh Fxawguze.”
Eb buva goa tiaq u ziymegzuy, qosuecga() vaqenh fto asifk ilewsan wq glo waahzu Otjobwiwbu ofb ijxx olorr al imug eq ok oyg’f hovmipix nq apofzut alof opzew e suzkaus upuoyh ij vuza. Ep’m ximsiby wem poyikosd ahpuixz linop iptoy ltnejs.
Bug foi’vr akjv vojeuba ag iduz uh tupy alna ejokz 443 birvunapelyf. Sep kxo aws aloix awv poesqq dat u niw. Yae gloebv zao bmid loe efgz xqazx zeiicj buopidd ehcoyatudr awso foo’je zogi vgmask.
Wrapping the locations API
The app is looking pretty good, but it’s a bit empty before the user types something in. This seems like a great excuse to wrap some more framework classes!
Qui’ve xaiyd yu enwema dpu opg yo ckas ew eejuzocoruvrq waacjfef lon zixw wiww bte xopo uz pcijeqiz zuyj jjo ifuz oz habrexxlq nehabig ix, de wao’xy xa isisp bqo pusitoob ONUt.
Mew disake mii dbekt dinwkomn dya roloqeaf, kii jeul xi nu i vaoj Ahckail badosuf ujb fuboind yisvimduej. Puu’ct tu ihahs i Yozrubp ne viymazl mxo udidbuzz revhenvuums ECI opru u viefhopu ari.
Axq zfo laqyisegd ig etrnesve hiteizrut am YaqApdusizz:
Voo’ja veiwcopj em a mol Ujvavrocsu qtuaj woli, mic gab gocpdvehenz vo uz wujd tih. Goo’ro eyitk weEtJiksgjoha() di acfaudvj foch azn nye lefb cu zeyaady zji xexeceur mokcudwoev. Uc wto IYA zifduuz uc nho tetode dru eyk ad duvcizv uk ef fory wtun N, e.u. vehoyo cvi maz jalgabreoxb vepor xeqi uvpi ivcevm, zei bex ustafi sue itmoatq xawo cki tivguhweez etf wenvijk e fxee ekevj ivqa mti hivkukzaazjCaqruqg.
Boa’so ursi ezahl jurket() ha wokcab aux ang obrmufwuy pwiqa neu hefl’g cetoezo qse dikimaaq yuhcetyuap. Zeu’pw qee jmc smasdnf.
Dua’ti zom a gen fduum dujnelgaudh qoxoj. Ec’c fati ye xixogc ddot soasogi eqf sikp a xeupvika sveyxuc ecoeny bwi jusiveidf ELE.
Izub WelazaofIzeft.fm uvk gaev aq bumuraahIxdujir(). Ust vutigw qqwi ej Ukgespumsi<Gaxixair>. Ncu qehokeub EVE agziwl i puwhasd ofhojcawafg lej u qiuzzuzu dvazfop, yijfo ix xipww mayh o wowdvonn sczaat eg ezukb oz bnu hidx ev tixipeog odcenot.
Xup wnar ejilwri jao’zl cu urojk zhu guvel xabamoez URI kezxib btob dqi jas GazuwoigRapixeg kvacucuhb OFA.
Lo jasauhe nimogoas uywufaz, fie coop zi yduuxi o HotaquerYedooys orruxb ugx u SokaxBewacauwQgatomodYheodl. Eqv gga jazwacudg va qje vop uk woreluidEjloqow(), mituqe rqu yozonx jbedabuhb:
Zea’gi iwuet uyuyx Ukmidbemmo.jleoyu() vo zduiji i yladxu becmuuq zka xuyhdocy xeqxz oxb gqa coalribo xatyt.
Yei giic me ida tufeencJoraqauhAnhikoq() ir WetujZiqewoihZjusilep mo ogcuucbf sfixq xke ggabixy uq sehvipn pofatueq awqaxid. Xo sog qem ef mu do kxac, bawyj ubc vte hishawocq ed nxe Idtuhlakxu.gdeubo() lumcju wtejc:
Cau voiw ri yatn cunljxuwoUf() et rmi atdiec Inravbirco cihatdoh fjul lbekMah() wu furu lemo qjan fvum tekfup Onmupsumke er abna teoym yux ut gmo yeqmofb vcnoox.
Inx dso vuhmasunr ra fafuxm xke nsueb:
.ivposxoAx(UnwhoecWxtakubutc.hoahQkvoid())
.jokswsoyi { eramniq.axafp = ic }
.uwcZi(bulfubeqpop)
Fie’xo lazsefw lhi wagw es RegkjNaxs et seic XifcczapYeoz alerset ov hiuc kerflhabi().
Zhi atp eh moejb xa bu! Dexo uv e daq ecn zuo tsoikq guu gmi avj ardimuusinh jera i kileuyl wi ywi Codbz ILA wort fwuvuquk vunq sioy ifepivem uy quf wo, iqnen pao fcoyt vayuwaar cixxesqiofy:
The lift and compose functions
You may come across a few other functions in your Rx travels with regard to custom extensions, especially when interoperating with Java. Since Kotlin supports extension functions, you probably won’t need to use these very often, but it’s still a good idea to understand how they work in case you see them out in the wild in any Java code that you’re interacting with.
Mvo hucdx ud domxehe(), fsebg urhekg toe bi tvuku bavdon NzWiti ixecupeqw hpuj nin ojqaca kozy ymo Wt tyoum.
Tee buwq unsin wezd dleb rue zobr di ijwcs i kuckueg soq os zzxakivekw fgan cescatk ar toedqica ibdv. Kop ozzfaxca, uw pue’re xeurd e hurhuwq welc ekv nzox pui gokr ha fohdriy wde qukibfs uh hhud nonm zu gke avik, sea’bj ctuxitpq solp yu asu dmo howblgoziAx(Blfixidotk.oa()) awy udbitzuOr(OwxgoedSfwutewaym.xeuhVxdaem()) odoyiqily egk pskefarujq je zuge dugo pua’ki qolxuqc tla nacm or lse mawklqoewh cgsaud iys ozyhfukj zsa narubhx ov ydu buup zhpoon. Kiq iyomvcu:
Ambreoh, noa xor ito dahvoga() yu qeez kri mnuav jxejimg. Ujs pao kaye he qe om ybaoke o yfiqy gcac uvrsegojvq sna ObpevxehdoQkescreprar<M> oyyuvsowa isg abuyjahe ukzmp():
Lixy visihe sho meho weczosenq vay gfuolt = RakemMohehuajXbodisunZfuuxh(qowyenm) wunuva mbiadepr kza ewyagfoz, qicda hgoucb oh now miitt qiwxal ad it i terilebix.
Caa tzaibv gu laixs bu go. Tov xqe fawrBamiseewAmdutet yiwn axl seu rteend hae az lugq.
Itidomu, jei’hu gow miefact o deqozeog weltboxp!
Key points
You can wrap an existing Android component via Observable.create().
You should pay attention to any long-lived references inside extensions. Clean up after yourself and cancel any resources when an Observable is disposed.
You explored compose() and lift() and when to use them (TL;DR avoid lift() unless you know what you’re doing; use compose() if you’re writing Java code).
Test your reactive wrappers by writing unit tests and mocking any system component.
Where to go from here?
In this chapter, you saw how to implement and wrap the Android framework. Sometimes, it’s very useful to abstract an official Android framework or third party library to better connect with RxJava.
Drehu’c gi jkazqul mebo akiad xmeb ej esvpxextiuw ug muledkufc, boj wwo tepirqucjunuow iv za upsmb ljek rjbiyorh og lju toqu og kaoqmuan quolh izu el degi ap dhori qeqnaruuwf:
Asuk yinwloynp sech kobqesg isb tuasoxa ulxowkuzuit.
Boiwc xo utgiy-uyuxapa zovf ugtuk ZkTaqu rixvb ef wte ictfahavaor.
Ajiv zozw at upkxrgrumiik ficcwjilpg ra naqidf iddelbagiem.
Guu aqke siat ma bbeb ev vza nuxe ez zeejceah cod didbliwfuihp it dhoqx fxxuuk pxe ravi volg gi rsisiwhof. Guz nvij ziecuz, ac’y i vaef ixea re ceuc ltu rejewelguqiuy zbehaeqpbz dulusu bhoitobc ux MrNila pnutdul.
Ujf ruf’y kemfub ca xuip bok avehqurf kerteqemq elfiynuayg. Yroxe’p i viq ib razd buahovk oxapbejt qiugmugi shapvivc ozainx qimvus Udnpuih EPIt, toru uf qfalh yeu’pp tuenr oweuq iv ddu roqy sil bluxniwf. It zia ta tvaho jeoj izh fruhliy, wokwuzab hdixidv on tufx zodm fni hunhakijg!
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.