5. diel - Programujeme pre Windows 8 - Zachovanie stavu aplikácie
V minulej lekcii, Programujeme pre Windows 8 - Navigácia medzi stránkami , sme si ukázali jednoduchú navigáciu medzi stránkami. Dnes sa pustíme do obsluhy stavu aplikácie a skúsime si ukladať nejaké dáta.
Na konci minulej lekcie sme si ukázali jednu neplechu. Pri navigácii na inú stránku a späť nám zmizne všetky dáta zo stránky. Dátami myslím vyplnené textbox, ďalej to môžu byť vybrané položky v listbox pod. Prečo sa to deje?
Navigácie a jej neplechy
Možno to môžeme nazvať neplechu, ja by som to nazval skôr výhodou. Každá stránka sa pri zobrazení zakladá úplne znovu, preto nám mizne vyplnené položky pod. Pri založenia stránky sa vždy volá metóda LoadState, ktorú má každá stránka. Naopak pri opustení stránky sa volá metóda SaveState. A v čom že je tá výhoda? Aplikácia nám zaberá menej pamäte. Síce v našom prípade nám to zaberá málo miesta aj keby sme mali 100 stránok s jedným textbox, ale skúste si predstaviť stránku 1000 dátami a potom presne 1000 stránok s podrobným popisom dát.
Keďže sme v prostredí Modern UI vo Windows 8, nemôžeme argumentovať, že "Dnešné PC majú obrovský výkon, nie je toto potrebné riešiť." Odpoveď znie "Musíme!". Nezabúdajme na rôzne tablety, ktoré majú mnohonásobne nižší výkon. A tablety s procesormi ARM už vôbec. Síce môžeme aplikáciu vytvoriť len pre určitý druh procesorov a na Windows Store rovnako aplikáciu ponúknuť, tj. Vypnúť podporu pre ARM, ale to predbieham. Raz si o tom povieme viac.
Ako teda riešiť ukladanie rozpísaných textbox? Poďme sa na to pozrieť.
Obsluha stavov aplikácie
Ako sme si povedali v prvom diele aplikácie prechádzajú do rôznych stavov. Aplikácie môžu prejsť do spánku (suspend režim) alebo môžu byť úplne vypnuté (terminate). Ak bola aplikácia v suspend režime, je vhodné, aby sa pri prebudení zobrazila v stave, v akom ju užívateľ opustil. Dnes si toto ukážeme. Než sa pustíme do samotného ukladania, poďme si vlastne povedať, akým spôsobom môžeme ukladať dáta. Windows 8, resp. WinRT nám ponúka niekoľko možností, ako uložiť dáta aplikácií. Môžeme ich ukladať len pre aktuálnu použitie (možno to prirovnať k session v PHP) alebo ukladať na disk používateľa. Avšak pozor! V prvom diele sme si nepovedali uzavretosť systému. Aplikácia pre Modern UI (Metro) nemôžu ukladať, kam sa im zachce. Majú iba špeciálne určené miesto, ktoré možno prirovnať k AppData. Celý systém je rovnaký ako na Windows Phone. Predstavte si bublinu okolo aplikácie. Do tejto bubliny môžeme dáta ukladať, mimo bublinu nie.
Uloženie stavu aplikácie
Máme teda dve hlavné možnosti uloženia dát a to AppData pre trvalé uloženie a Session pre aktuálnu uloženie, teda po vypnutí aplikácie dáta zo Session zmizne. My si skúsime uložiť dáta oboma spôsobmi. Z textbox meno (txName) si uložíme text natrvalo. Z druhého texboxu uložíme text len ako session.
Možnosti AppData ukladania
- Local settings - lokálne nastavenia aplikácie (kľúč <-> hodnota)
- Local Folder - lokálne priečinok pre súbory aplikácie (ľubovoľné súbory)
- Roaming settings - roaming nastavenia aplikácie (kľúč <-> hodnota)
- Roaming Folder - roaming priečinok pre súbory aplikácie (ľubovoľné súbory)
- Temporary folder - temp aplikácie
Roaming je špeciálny zložkou / nastavením, ktoré sa samo synchronizuje cez SkyDrive. Týmto spôsobom zabezpečíme pohodlné presunutie dát z jedného zariadenia do druhého. Príkladom môže byť úkolníček. Napíšete si úkolníček na tabletu a na stolnom počítači si ich prečítate. Jednoduché, že?
Použitie Session (pageState)
Než sa pustíme do uloženia, trochu si zrovnáme termín Sessions. Hoci som napísal, že sa dá prirovnať k sessions v PHP, nie je tomu tak. Sessions tu máme predstavované slovníky Dictionary <String, Object>. Každá stránka má vlastný slovník. Týmto môžeme ľahko uložiť a načítať dáta každej stránky zvlášť. Odovzdávanie dáta medzi stránkami môžeme urobiť cez Navigáciu alebo samozrejme využiť rôznych návrhových vzorov (Singleton, ...). Koniec rozprávanie ideme na vec. Máme dve riešenia, ako dáta uložiť. Prvým riešením je zapnutie cachovanie aplikácia stránok. Nie je to žiadna veda. Nasledujúci kód dajte do konstruktoru stránky, kde chcete zapnúť Cache.
this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
Teraz sa všetky vyplnené textbox, vybrané položky pod. Uloží a pri opätovnom otvorení sa nám zobrazí v stave, v akom sme ich nechali. Tento spôsob my nevyužijeme a nie vždy sa používa. Cachovanie stránok vlastne využíva tiež Session. My si ukážeme vlastnú prácu s ukladaním.
Každá stránka obsahuje dve metódy LoadState a SaveState. Čo metódy robia je viac než jasné. Prvý načíta dáta, druhá ukladá . Zrýchlime trochu tempo a časom si nasledujúce riadky vysvetlíme podrobnejšie. Presuňte sa na App.xaml.cs. Metódy OnLaunched a OnSuspending označte ako asynchrónne, slovíčko async. Bude to vyzerať teda v štýle
protected async override void OnLaunched(LaunchActivatedEventArgs args)
V metóde OnLaunched v podmienke if (rootframe == null) pridajte pod založenie Frame nasledujúci riadok. Zaistí nám zaregistrovanie hlavnej stránky pre SuspensionManager, ktorý nám zabezpečuje ukladanie. Podobne musíme registrovať aj ďalšie stránky.
SuspensionManager.RegisterFrame(rootFrame, "mainPage");
Do podmienky if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) pridajte zavolanie RestoreAsync (), zaistí zavolanie LoadState na všetkých registrovaných Frame ch. Bystrejší z vás pochopili, že ho voláme vtedy, kedy sa aplikácia úplne zapla. Slovíčko Await nám zaistí oddelené vlákno.
await SuspensionManager.RestoreAsync();
V metóde OnSuspending pridajte hneď pod prvý riadok. Tým sme zaistili zavolaní metódy SaveState () na všetkých zaregistrovaných Frame ch.
await SuspensionManager.SaveAsync();
Presuňte sa do MainPage.xaml.cs. V metóde SaveState si uložíme do LocalSettings meno a do session vypísaný vek. Sessions je tu predstavované slovníkom (kľúč <-> hodnota) nazvanom pageState.
// Appdata - stálá data - nastavení aplikace ApplicationDataContainer localSet = ApplicationData.Current.LocalSettings; localSet.Values["name"] = txName.Text; // session data - akutální data - po terminate stavu data zmizí pageState["vek"] = txVek.Text;
Do zložky LocalSettings sme si uložili hodnotu textbox txJmeno a to iba text. Do sessions (pageState) sme si uložili vek a opäť iba text. Nie je potreba ukladať celý objekt TextBox. Poďme ešte dáta načítať a máme hotovo. Nasledujúce riadky vložte do metódy LoadState ().
//načte session //Podmínka - pagestate nesmí být null a obsahuje klíč "vek" ? if (pageState != null && pageState.ContainsKey("vek")) { txVek.Text = pageState["vek"].ToString(); //načteme věk z pagestate a uložíme do textu textboxu txVek } //app data - localsetting - nastavení aplikace ApplicationDataContainer localSet = ApplicationData.Current.LocalSettings; //Podmínka - obsahuje klíč "name" ? if(localSet.Values.ContainsKey("name")) { txName.Text = localSet.Values["name"].ToString(); // načteme klíč }
funkčné ukladanie
Opäť sme u konca. V budúcej lekcii, Programujeme pre Windows 8 - Práca so súbormi , sa pozrieme podrobnejšie na ukladanie do AppData. Skúsime si urobiť aplikáciu na jednoduchú správu užívateľov, ktorá bude vedieť ukladať a načítavať dáta. Nie je to žiadna veda, len si ukážeme potrebné triedy .
Ak sa vám dnešný lekcie páčila, budem veľmi rád za spätnú väzbu. Ak máte nejaké otázky určite sa nebojte opýtať. Vždy sa pokúsim poradiť. Ako vždy je priložený zdrojový kód aplikácie.
U ďalšie lekcie sa na vás teším!
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 231x (283.92 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#