Programování pro operační systém Android může být náročné hned z několika důvodů. Jedním z nich je nedostatečné oddělení zodpovědností. Pokud zkušený vývojář, zvyklý kódovat „tak jak se má”, přejde na Android, může být celkem zmaten relativním nepořádkem, který panuje mezi nativními komponenty uvnitř systému. Activity, adaptéry nebo fragmenty musí často míchat dohromady aplikační logiku, přístup k datům a jejich prezentaci, protože architektura Androidu neobsahuje žádný efektivní mechanismus, který by je umožnil oddělovat. Výsledkem je volně propojená, obtížně rozšířitelná aplikace se sklonem k vytváření chyb, kterou je náročné testovat a udržovat v dobrém stavu. Naštěstí, vývoj Androidu jde stále kupředu a objevují se nové vzory i interpretace těch starých, které mají vývojářům usnadnit práci. My si povíme o jednom z nich, o vzoru MVP.
Standardní aplikace architektury v Androidu
Uživatel interaguje s fragmentem nebo activitou, které reprezentují logickou část obrazovky (ve většině případů se jedná dokonce o celou obrazovku). V téměř všech příkladech vzatých od vývojářů Googlu/Androidu je na první pohled zjevné, že aplikační logika je umístěna ve fragmentu nebo v activitě, což se zdá být špatně. Pokud chcete provést nějakou asynchronní operaci, musíte se zabývat několika hraničními případy, jakými jsou rotace obrazovky, minimalizace aplikace a podobně.
Co je MVP
Model View Presenter (MVP) je návrhový vzor, který vychází ze vzoru Model View Controller, po němž také podědil většinu vlastností. Hlavní rozdíl je v tom, co má na starosti mezivrstva – Presenter/Controller. Zatímco Controller definuje chování a typicky spravuje několik View, Presenter je ve většině případů v přímém vztahu pouze s jediným. Dalším rozdílem je, že View může v MVC komunikovat přímo s Modelem, ale v MVP je to Presenter, který má zodpovědnost za veškerou „komunikaci“ mezi View a Modelem.
View
View je zobrazovací vrstva, který uživateli ukazuje informace a veškeré input eventy jako zmáčknutí tlačítka, vložení textu, přesouvá k Presenteru.
Presenter
Presenter má za úkol zpracovávat View input eventy a dotazovat se na data z Modelu. Když data dorazí do Presenteru, tak jsou zpracována a napojena na View.
Model
Model je všechno, co si představíme ve spojení s daty – API, databáze, složky atd. Model má na starosti získávat zpět data a může být pověřen i sledováním změn v datech (jako v databázi), o kterých následně informuje Presenter.
Android a MVP
Zvolili jsme jeden z mnoha postupů jak aplikovat vzor MVP na Android, který je využíván množstvím dalších vývojářů. Abstraktní diagram je zobrazen v následujícím diagramu.
View je standardně activitou nebo fragmentem (ale vhodná Android View třída je také možná). Jakákoli z těchto tříd by měla implementovat interface definovaný pro toto View. Presenter neví, jaká implementace se nachází za tímto rozhraním, a tak se vývojář může snadno rozhodnout, zda chce například přejít z fragmentu na activitu nebo opačně. Jediný úkol tohoto View je zobrazovat data a posílat UI eventy do Presenteru. Toto je hlavní rozdíl ve srovnání s architekturou klasické androidové aplikace, kde všechna logika leží v kódu activity/fragmentu a je závislá na jeho stavu.
Tento View má instanci tříd Presenteru a je zodpovědný i za vytváření. V ideálním případě je instance Presenteru aktivní po celou dobu, kdy uživatel pracuje s activitou/fragmentem, dokonce i v backstacku. Poté by měla být zničena a uvolněna ve chvíli, kdy uživatel opustí „obrazovku“ a kdy již není možné se k ní vrátit.
Na Androidu je specifické to, že View nemusí být napojeno na Presenter po celou dobu, kdy je Presenter aktivní (rotace zařízení, pokud je aplikace na popředí atd.). Proto se View musí na Presenter napojit/odpojit. Ve fragmentu nebo activitě je jednoduché toho docílit za pomocí metod onResume/onPause.
Pro lepší představu jsem vytvořil jednoduchou aplikaci, která simuluje login uživatele.
Můžete vidět dva rozdílné postupy:
- LoginActivity, který je generovaný Android Studiem a uvnitř obsahuje veškerou logiku.
- Stejný kód jako v 1), ale tentokrát s použitím MVP.
Zdrojové kódy: https://github.com/AckeeCZ/MVPexample.
Shrnutí
Představili jsme vzor MVP a jeho implementaci na platformě Android. V sample aplikaci jsou ukázány rozdíly mezi typickou a MVP architekturou v případě loginu uživatele. V následujícím článku Vám ukážeme několik přístupů k MVP a rozdílné knihovny, a také se podělíme o naše zkušenosti s nimi.