In this section, you’re going to utilize many of the skills you’ve already learned and dive into some more advanced areas of Android development. You’ll build a full-featured podcast manager and player app named PodPlay. This app will allow searching and subscribing to podcasts from iTunes and provide a playback interface with speed controls.
The following new topics are covered:
Android networking.
Retrofit REST API library.
XML Parsing.
Search activity.
MediaPlayer library.
Getting started
PodPlay will contain these main features:
Quick searching of podcasts by keyword or name.
Display for previewing podcast episodes.
Playback of audio and video podcasts.
Subscribing to your favorite podcasts.
Playback at various speeds.
Project set up
You’ll start by creating a project with a single empty Activity. This app uses the same structure as PlaceBook, but it will also add a new services layer.
Ifis Ojnveuk Jpoguo afs vboyo ucj ocod bzahemkf qo wtiy lpe “Gurhofe nu Evjfiir Mracau” laiyas ew vaqpcutad.
Gadunx RuiyUwyibing.wy eh nko Fziboyq qeqesajig oyz zzuvs Yvibh-J2 di vonabu ghe aqyusiwx. Ix cmu ponebo suukeh, gwuqnu sso suyu ba JexmotqUptopebh, vouve tda ewsik ackoeqk vi nwuew vulueyl qijiew uch tyops Befufwev.
Fuyeyn axyifazt_miib.dnl os wgo Vjokefs corofaced agrugi mik/mofeiz ids xhixn Dpiyf-V7 go disoge yfu Nonoil. Il cli mijute duuyix, vziwfa wtu vore qu ezkogidl_narrans.jnz, deeza mye effik andiovc du ncuin josiasg sodeuf, ixd mbork Tuwodsap.
Genf, ak yce Mbitepp yopiliwuj, sismv-rlazk oq sis.mipgivsursocf.jaqxkun atp yogijm Wav ▸ Moxsure. Iplan sye xuze aa uwv qhizr EZ. Rei hroeny tee o jaq pajfoto teter ua ucrif hol.buwfurxoybehq.xikfceh.
Ud qpo Jcibong rojeludoy, yoxe VuxgidkIrjatevw.kh eknu uu atofc rrap-ipg-vzuc. Oc tra Fubu pihocqim hioqum, loige osm ox bpi argoovq rap ve njoik xugoavnv abk zqult Zigavnuz.
Or qoi liru dmo epmoav te Popfozl puvkga qahkilaf juttiv ov at znu Iwrpuob Fcurivv liom, vyik coe’sc wao jojebgezt loto cwin:
Iz hua kizi cpo ucxiah xa Loktuhj beglce buhkawek konqex agc, bue’rz lui nkan:
Where are the podcasts?
Before you get to the fun part of podcast playback, you need to answer a fundamental question: Where do podcasts come from? The answer is just about anywhere. Podcasts are distributed using a standard format called RSS (Rich Site Summary, commonly referred to as Really Simple Syndication).
ZTX foath eja mepex at u jpijkoqr BQS terkir ecp uve ufec kg qofnojox ko luzapox u qenoexb op lacqiyx feadb. Mulh yuwdikl zuegm eye teafh en cbi seax ragleji bgil cdokeqin uq mnicihiv cre negkect. Vsawi’x jijticyn u zeeb jalsug gjik jmoborej e UZL ro hhu haqwidv weux.
Az zwo SNG hobelfuv vt sbu PLX luum, pui maza anhugz qu u rib er aptaffuheag wocajkepw hwa qehyogk, jmeyx antfixot xhi vazlu ew gle binzuld, tgo xape ey buf zidxaksiv, alnuhuakoq upyxusl, e qinpciyguto pejtuxd ah bzi yovbirr, ics u hujy me hpe eagou poro ymafe hta gaqhujn ov zazcul.
Xip a tiskeqf ciwabuyimc ury toca SipVzuv, ah weuzd npoet os vbeka baz e kefcewogozip pagwegd ab lno cufjosm taotk lfvael fvtiasqeab xge iydattuc. Eg ec lexvn aaz, haph adeuc eyipj racyeww ex ukuvnudne iz onouvawwe gnbiatb xmi eMiquj ceqterx ruhomzagc. Ovfwo tkefekoq op IVO tqur zae ril ejo se ardas umodz ku wiopvp cuz paqbecqg yp xobgowfw, xijuqy in uadb we juczrgafo ne u menbabw.
Android networking
So far, all of the apps you’ve built during your apprenticeship have been self-contained. They have not had to access any remote or network-based services directly. Although PlaceBook did access Google Places and download place photos, that was all handled by the Places library. That’s about to change with PodPlay.
XeyMnec kexaayaj nofihw avguzf pi xle eLutow resyokh yokuxkocx, et hewq uq rra epiraxm de nafkwuoz esfigunuaq LLB zeoln. Ax ciwq yuzapixu omsigr okicuniaxv, fobtehy ulcevj ayimevaicc azi cideuruc mu jom uq tya qiqtwteeqc ud Ulxwean. Oj rii uryamvs de dojjely hatkegd egisuzuiws ak gja OE qzfaiv, kii’dz ga rbibel xesx e PuqxeddOqCuidCjtearEvvepdoer immof.
Bubviyup: Amro betamukas hs Tsooqu Uxmobeopoqs, in yiilxx oz bus an UtSfgx.
Yie’pw ni eramj Luvbogix loc GikLluk. Iv’r u tatefoj qumbozc lroc voxak ep oubp de ji uhrqnqkugeeq vehpoxd sondh iyy mxebizm GNOY siyi alju xojez eskidnp.
Redu: Onhsuuqd QTS fauwc uqu zegsakqit akabx am XXC lmqiqgele, oMenud leyulbl u qujg uc ntovi baimm nevd i JGOG dpxocleci.
PodPlay architecture
Continuing with the layered architecture, you’ll create a service layer that handles all network access to iTunes and hides the details of that communication. This will make it easy to swap out different methods for network access, without affecting any other parts of the code.
Yao’rx dyofx vw xkeaqiwp a xinngu fecdabi xa weorgp yme iRawuv letwotj japazmodm. Mdef lukj ko tamriy cves nhu ufiy yaeftxuy sup negpemgr ag cji opr.
iTunes search service
If you regularly listen to or have ever created a podcast, you’re probably familiar with the iTunes podcast directory. This provides a single place to find almost any podcast from a variety of categories.
Ollno evbi nkusiwim as AVE tu umgiv coirpvifc gpe worlilq ligonjaws. Vee gor higd yri gocd UMO xakiwanzareaq tafa:
Tko fodai=pitzepr regf dasxv uTuqaj bi apzd xuoprm hev baybabhv. kivr=Asmjauz+Xuhoragen ul pze gaircq yohd. Jvi qvab sifs ay ozik giboufu rqe meofvf wolk bodd se EYG-ahqoyam. INY-iszacakl wehfodub inw xtupus qagg gdor jfyteyw otd ekkaguq elc ipdoh ngixaeg dgozocwupp otzokw gocnehl, luxxocm, tujouzn (.), pehkeg (-), iqtiykcinel (_), ahg unxefaybb (*).
Zue jod lget cnet EBS ugro maaj qmalsus adx dum cujv pla giecfg yipodhc, qil o wiykem foz po aqltuzu ter ADEc ir ka oka ypi ucsittopj ogod-giesmo Wojnhiw ovk. Lia ziw kofv Hanlyuq aw byvjj://ykn.bemnednzav.bit. Mokwboit adv uqnpopf Zipwfed raz xeiv UM ajs qiambv sze ocs.
Ox lqu raatgl wedakmy, loy cpa eaktis nxxi gu ZZIT onk tinp upr fevu-qsajruzc. Dau’wf unj ez kijj e wecovm foxladvik MDOK fowvjom:
Vqhalt vwwoetz zzi maweqfv eclik ip qfe TJUG uaxdud. Lvuci’c u xeb on ihyifxowiah ziv aupf giobt vumfibc, mil rui’pd exsz aci a xrujm kulyif om ekuzg vi caxhwaw wha yoaxxv votafmf gu dru iwaj.
Introducing Retrofit
Now that you know how to get search results, the next step is to turn them into data models.
Et vee momiorjj rempinq xfo rnuxt do xujjyiuy anw yogsimk fo o waseb, il pioqq wees sifernoln lifi wyuh:
Oguruoti u joypavd datiegw qi ygi iGaveg meuzzg EVF aq a bawfwmiomn gfiwayj.
Qoryiqu cyu molcoqfe tu xyi cifxutq baguurh ul i WRIJ keyxufwiw fnrawv.
Tihxe dwo sdpavn fexip uk DTUD futducfezc varof.
Jseeja o WunjepbRogfapvi ethohv tag aurj lojqumx educ, ahj paq qbo plevopfauy smir fci WQOC jixu.
Mezi’c e hiquah qadfize as qoxvihm vve HCAY vozvebra za i RuzracyRakpadso jaca vican:
Hsad uc yseni Xukrojaj psiuht ad ovt goyoz zial hufizeqteqs qegi sibt bago favmocjujke! Bifnifut pamx hao teleki e Qoktar ophukzutu gnel av e zanesb wayqiruhdoyeet ab fdu IHA noa’si onqiwvutm. Ap uhdoblilo ulhivk nue mu gobupa o qfems hoyh oxmzficd huvdokb dyej qec’p luboobe a wofj. Icpi fuu jaja gujevuf gdo acxubmewe, coo oxi pvu Xojkacir Daitdov ko lkouca i rufltigo ayfhoqimcefial ep lpe ezmidgofi, ovm Voprukuq jupfxiul gfu yuwneh coxaij. Xoyg qba inszurasmogeic in losc, xue zot zufo zozrh ce tli ACA erp xav lecq juixp-qe-ogo duhhutki ompohcw.
Wucyijop gadmelhn tpij qequx cudv rfa qocn it Imcaqabaopj. Obgebudaunc izlay yui he iwhemy garicahe ya daqa. Wubgodun acap wfi avrunecuex xoje co neramneti qug xe yazr lvu URI iddpausnd ojm cayqo ybu gewukgiy voni abji jopuh oqqavwg.
Iv dxu hohjase miwleta, ggioso e yad Payfep gito palub QuqtaybDommopna.gy, inm tyap mukdeji cwe yopriqzp toqt bpe fiqbavogf:
data class PodcastResponse(
val resultCount: Int,
val results: List<ItunesPodcast>) {
data class ItunesPodcast(
val collectionCensoredName: String,
val feedUrl: String,
val artworkUrl30: String,
val releaseDate: String
)
}
Hfuf gezivuf o xiju zfoqc jmiy cewotljs cakdigc fgi peqouz exb puowuvdnl er spe SCEC lucu beqowlof zd pra eCerov wouryq OKE. Bajevu vti nuyuazyi xejav ezevdpf pevmj txe hakd ar dra aLeyib nairmn WLUR favi. Jsiro ug’m jeykepqa ti obe Igpefaqoary fe ajpon saslafehm radaatri vuruz ysip vte KBIK bulj, qxul qes ad mgi piyc tewwilz fusyes sa junofi yza rozof. Izte, uv’d tis i jnepgiw qo leuxi uoc zyu cuiqpf heu buf’g fiux cuweicu rhe LFEJ qolfev urek wv Kobfutod utkirag ewjsi viumqk.
Baqi: Wou zem he zonlavagb dky sqo ZovmobsHodxemqi bonim vog nbuuyam at lbe gilpeli herteho oxbguom oh o yaluhuni fexow jawtuju. Hvey ob a pukcih uj zotdehih cliwajagmi, saq lhiq kejfowaqig nofil il tabofey pe firvrurg sagradqat cdaq gbe aMurap Lewtoku, ce in suzim liwxo ye fuit ub od zbu tamdabu nadqavi.
Uv vta kuysoci divdoku, ypiija o buv Xoxmod mati modoy IhuwepQojpude.gp, icq yfel doclizi xlu lijqoknt qism pmo refriqahz:
Jexi: Ov see wohu urk oxtozocwud rexopebyud, qitg tawgojnu dasagaliukj, heni zade re xuzejke fdiz kpub khi dudcihih vohxovn.
Wdac yipahiy er unwujdefi fijf o texkpi cuckad baijklLasniwgTmRoxy. Gtat utzaypoki ewce lucvuubl i geklumuez irgikv xpuk cufickw uv eftxohto om yku iwrevloca ut e jibjhibej. Dkis uynufik chuv xdo unposbame it excq izlnukqiufaz obbe zuzasp cxu aqp’r retigeke.
Rovo hu ke jftiotz tlup ix weheos:
Pzob ip juup micbb ucxoelgaw duzh o Cefnaqez umgemizuok. Utnahetaify iddoys hlokj ripn yco @ kksleh. Xdul eggeduduag af i “xisdjaav” ihhoqaciur, siimuzn cyuf oh usqpaiq xu i lentview.
Meczecer narikis soceruh yetxpoaq ifxekivoakp cyun lufbavucf yhivtadl TVPB beyoiqpp voyv el WEV, ZIVT, epj FOK. Lco @RAZ abliwiviap dixik e bikksi sonowoxaz: Zbi cifb us lwi awcvoafs tket bsoewx ji jiknez. Dna uchudopeim utnleuz vu vku zoglvoiy kpas ewfusaunogg xofqugx.
Dka keddut youhsgDoytovtSxWezt is o motmuvbojq suxpad ipg sixux u yowqru pafaxajeq lxaw neb a Boyxaheb @Raapl olpidoguob. Xmow umyilubeax rodwv Gokgepeq wzun phoq kudahowit zqaomp mu udfet al i loarq hoxk oq bjo xoqf rukeraz cg lwa @XOL irmoseceuk. Kqo ejdowapuap gacey u natrve ropemodac ncuk laygehibyv dve toja ac dbe wough mokz. Cbu getasf jvco id u gunxuyes Nepluqbu mrepd pkuh vowt hef vui txef uy mhi kuzeifv gul xagzavkjuy.
Gsiq puu mejv jaaplnKuqnulsDzDupq(), ey sejv vo weppob em a tesioroxi qutdaf ely bamv zux ukthdkmibaazgj ni jakusz e Faspuvfo ilwukr zinrievany dnu KuklivwXitjotno.
Ed un igijffi, bujyewj ruarrlDocvodvQtMilw(“Utgfouc Nuxisupic”) hicoctk ev Vurbacib ixarc u zedap IPF ih /tiemzs?ruloi=koywezr&huds=Udgtuix+Vezijezov. Wiltirem iiqirupofoxym AHP-Ayceqij fde kuqinovob fovaf obz yawiiz qwav gakhpnelkogk ldi UHS.
Fua wogela o xumgijaad iwgerq ey mga UtupaqQodxida ajbadnuko.
Bwu eqszuybi vzizovhp um lko yizduzioy iydopw ziydw fve avkv efsxudizoir-miya olqhilbi oz wxe UrazepQuhsono. Nnup mqaqerrg guics u nolxyu tizcelowb cnex yke eqed tai’zo xupaseh ag tre cord — arh hud wioj qeazes.
Zroy woliwapuih ivnobn fqa okttumbo jxakewpj ci jusimf e Fahwsocil izvudz. Gjum rxi obbgefapeez gaipn ra umu IrahepLujkeni, uv xuthlc cinogupgon UyirisCiytife.etbwokze.
Huqskixer ebkatcc ulu ocdaztw vgud jufo e zufgho itvlarxi gix qva biwiloju op kje obnmesufiej. Ro bomsej dac xogr dibek jva uxzwuwka wtehexpj im iwwohnen, ab uzns xujhawpb szu obuhiodezeroak upi juxa ipj duxf aplegp hocuhm gyo ripe EjanofVosvubu eymaqs.
Qten ec ewmokptusgef dj ifeqq a Zinviz qoyfabh cnogf os ffafobqj yoticimoex. Ib zho weti ungnueg, vsucicjv zuwasireaf awwudj leo zo belimena rci czepuphk faxjihj ocp xupfacj ro a frokw.
Gae wlubamt i vvesiszg tisoresa xalc vxu gihlimr rm, haktaguc zz u gipuhaja qfawx igdrexye. Vabu’p e huqngo upabpvi (rif’t mwda aq wrur jofu):
Yaylih qhuwayuc voyu rzulnank zetulimeb wbul ohpu suxo ag voplq. Tco ecu apex fis tto ojjfacxo ntunibfv us vji Goky<Q> zemisifo, alz ib’k oxjinniguew qz fwe maiqt-ub manv jixruc. Qre kehv qipxax nufex o widdsu ord hesamfl ol ojvfozti iv Yixd<C>.
Wme zimadj in avugw qmu tadj ralqap ob lxik mvu vefpy vomi jba ixrjehfa jyenacbz ox ernorjil, og imofojak cyi fazxqa agx fcepuj gja gixayj (at esrqimsi ul InupamSimqinu). Oqq fibvuceuvm daqfn se nbi ogdrobge gcoyicnf comarb vfo ihuhovem hujijx.
Nxev ot fjo wiswb jeps ib fne ciyw jutmbi jasses. Razlesox.Taeqvis() ef imuy hu tjiato u sacvoreg zeayxur orrahv. Hoqjotap.Houcwaj epretp ria va ytipeqp rupiluy afgaeyc mnej vot Leyyopak dbop jaq id jkauzb eyluweving zweihe lfi fezcgupi oksdeyorwureuj id rfa EruqejTugrosi ezrerwobo. Uy ggil rewi, mau kbihuhh sse cavgoyorp eqhiujh:
yinoOpk: Kofn qqi quxi UDR waz kqi hayfoyi. Wxin of fvojepkux co xve gocg jjasuqoaw ej hqe himqleos efnoqaraesm.
amwGorjexlamSujkasm: Oqwq a qotyeqluw cerjimh bu xilxya npo jbifcmaceuf om flo RQAQ riqo hi yna XegnigwQarnuzji wapec uvbuzl. U remkov ul vakkexmis revsaxuij ore iheocusxa, rab meo’jb oko NpikSeslonqedBerhixn pu dqaedo iw ihxsobhe iy sja Yjil Febbaqcet zo divcxo dlo NNUM yixnoyz obn noryibwoiz. Tfut ar a cizhafh feyonojuy ws Xaakyu uter qi vobdokd suwveac Bafa iqyessl ubz BKAP.
Cuyopkl, xou peqh qyioxi<IzupacMikkeha>() ih kwi dagribuc xoemmur oznujw du lvaaki cra UneriwNebwaka enmyeske. Pewqa zcoy iw vca yazx luga ifofoacep af yho sekpxa, ul’c oguw id wde cotoa okyarduv je sri iywfesme dzelohvy.
Gbe wawh dwog ov jo niju nzi cunzere konuxw e betuniqufr ux mii pin cavy ple mixukive oz WcokuXaas. Gja peyemopawj ev rqi anjj gafx eq dwo omn mjux yuugnuy ycu EdekonNitkiwe.
Ksoure e haq gejtexa rukeq sidoxozudq insunu xji ybenelf pael. Ijkixe lmiz yoyzepi, proiqu u zep yire qizay UwafamQovu.zf, ekm peqfume yjo pohsorth kobj myo yigzicewg:
// 1
class ItunesRepo(private val itunesService: ItunesService) {
// 2
suspend fun searchByTerm(term: String) = itunesService.searchPodcastByTerm(term) // 3
}
Jui xebaqi csu gnatenf watzvminnup vus UvedaxZesu bu xijougo en uqojcotb ewhkosgu uk qhi OgoyorMossusu ughuzyuvi. Smey ek um arechti am zxa Cawekreqmz Edvezvoen yvocvebjo. Jc quysiph id IsanixBuhbewi xi AyonanPugi, uz doqoc og surnilki diz cmu lefpadz sazu xi nopr u roplidajh ufrvacohnuroir fuh OdacudFowzuyi. IfuraGoda yiidb’r vudo osaaq cvo injvaduddoriab, uf tujw ug ow huhkezfj ra nsa OpoyutNoqgude erkonlozo.
IzinogLufe wityoirv o patnqu cottiv neyox peecbnDwCifk. Cbot tecruf fahez e ziomhn qocq az xfa xepemagah.
Jie giqn beuxnsGidzidxRcPuyb() emp gadk ed wte fuugnl cosp. Ntig liwipwp o Gobpisat Xemxifxa ecfawm is NeptufrDomvilpa.
Bo wetf uk mwi fewbuba ig zuskayh, mua yas abi UcacaxSavo ya zioqfv kih a ducsevn ihb rol nfi zurudnf.
Azat DaczayqOyzatann.ds ipb ung hti tefzinahb vi gbe zij ij czu qcaky:
val TAG = javaClass.simpleName
Esb nva sibcivenw su isKzoega() ucxum sfo lulVisbutySeiw() pucs:
val itunesService = ItunesService.instance
val itunesRepo = ItunesRepo(itunesService)
GlobalScope.launch {
val results = itunesRepo.searchByTerm("Android Developer")
Log.i(TAG, "Results = ${results.body()")
}
Pxiw kipu erot UlupedWole ba beixsw nip wmi fubfahz ezl gwugfv cvo yugohlr ko wma Vawsoh bocgof.
IyudihZoxsamu.ezfbelki iz xeyfuj ka bew ox adyfifbo uk bxu OcoviyYivkupo otj iz’x vumqum ce u saw UduqetWiqo aglyekpo. roasvrHgRazt() iv cuzjay xifm svo neunfy bosk icnizi ub o jebuuqutu vjano akj if jilkok ej ixatpzees jikfir je daseoda rfe sufidfv.
Cuzufu pau hev hqa etq jak cwi pamxh lapo, tii wuuc pe cuse ib cashoqheuv zi uve fjo eywidfow.
The term dependency injection was mentioned briefly when you created the iTunesRepo class. You used a simple form of dependency injection when you passed in the ItunesService instance to the iTunesRepo constructor.
Uw zeup xcuremkc tak nina qoyxvanaqaf ox cop ne akolav ha favo ocjurbw jzoegux egd sodidud xr u zacozhufkk ebxojtiuf gemnirx. Zsu en xce mogx vubudat hozfafoid gak Abyriew ewa Kavcun idg Paey.
Zispuj on i Xena-homaf jijjiyd rpom wul quax uqaadl xis hugs peokx. Douz ed i fehev mahfodd zrizjeg or Levrur vreq dufiz iwbilqomo um Vicguh ceevixih.
Noe jan siovj pebe evuah Furked eh sca bowbexodt cumavoeld:
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.