Sledujte nás na YouTube

Windows Phone 7 a Reactive Extensions v praxi

Reactive Extensions je knižnica pre .NET, ktorá zavádza trochu iný pohľad na prácu s dátami, najmä kolekciami a udalosťami. Od Manga môžete Rx používať aj vo Windows Phone.

Reactive Extensions (ďalej Rx) je knižnica pre .NET, ktorá zavádza trochu iný pohľad na prácu s dátami, najmä kolekciami a udalosťami. Od Manga môžete Rx používať aj vo Windows Phone 7. Tento článok vám ukáže, ako si pomocou Rx uľahčiť niektoré programátorské úlohy. Nasledujúce ukážky je síce možné používať aj bez znalosti Rx, odporúčam však prečítať si aspoň môj Úvod do Reactive Extensions uverejnený na Zdroják.cz.

Observable.Timer 

Ak potrebujete vo Windows Phone 7 aplikácií vykonávať nejaké operácie pravidelne, pravdepodobne ste zvyknutí používať nejaký Timer. V .NET je ich na výber niekoľko, vo Windows Phone 7 sa najčastejšie používa DispatcherTimer. Kód, ktorý každých 4 minút volá metódu DoSomething() by s použitím DispatcherTimer vyzeral takto:

DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromMinutes(4) };
 timer.Tick += (s,e) => DoSomething();
 timer.Start();

Kód je síce krátky a relatívne zrozumiteľný, je z neho však vidieť viac spôsob, akým cieľ dosiahnuť ako samotným cieľ. Ekvivalentný kód v Rx by vyzeral nasledovne:

Observable.Timer(TimeSpan.FromMinutes(4)).Subscribe(_=> DoSomething());

Tento kód je jednoduchý, prehľadný a na prvý pohľad vidno, čo ním chcel programátor dosiahnuť.  

Scheduler 

Ak potrebujete vykonať nejakú akciu v presne daný čas, opäť sa núka použiť DispatcherTimer s intervalom predstavujúcim čas do danej udalosti ale s nejakým kratším intervalom a kontrolou času. Po vykonaní operácie je ešte nutné DispatcherTimer  zastaviť.

V Rx je možné tento scenár realizovať oveľa jednoduchšie pomocou triedy Scheduler:

Scheduler.Schedule(Scheduler.Dispatcher, () => DoSomething(), new DateTimeOffset(DateTime.Now.AddMinutes(1)));

Dokonca je možné veľmi jednoducho určiť, v akom vlákne bude daný kód vykonaný:

 

Observable.FromEvent 

Pomocou Observable.FromEvent je možné akúkoľvek udalosť previesť na kolekciu IObservable. Takouto kolekciou môžu byť napríklad súradnice z GPS. Ak chcete zamerať polohu používateľa a nechcete reagovať hneď na prvú súradnicu, ktorá býva často nepresná, s Rx je to (ako vždy) jednoduché:

GeoCoordinateWatcher watcher = new GeoCoordinateWatcher();

Observable.FromEvent<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher, „PositionChanged“).Skip(1).Subscribe((arg) =>
{
    watcher.Stop();
    DoSomething(arg.EventArgs.Position.Location)

});
watcher.Start();

Rx nájde uplatnenie aj v zložitejších scenároch. Predstavte si, že vo Windows Phone 7 aplikácií máte TextBox, do ktorého používateľ píše text, ktorý chce vyhľadať na Wikipédií. Pod TextBoxom je komponenta WebBrowser, ktorá nájdenú stránku Wikipédie zobrazuje. Vzhľadom na dobrú použiteľnosť chceme výsledky vo Wikipédií zobrazovať nie po každom zadanom znaku ale až v momente, keď používateľ prestane na chvíľu písať. 

V Rx (za predpokladu, že daný TextBox sa volá Search) stačí najprv pomocou Observable.FromEvent  získať IObservable z udalostí KeyUp a použiť operátor Throttle:

var keys = Observable.FromEvent<KeyEventArgs>(  Search, „KeyUp“ ) .Throttle( TimeSpan.FromSeconds( 0.5 ) );

Kolekcia keys teraz bude vďaka Throttle posielať udalosti len v prípade, že používateľ na pol sekundy zastaví písanie. Následné zobrazenie výsledku vyhľadávania vo Wikipédií je už pomocou operátora Subscribe jednoduché

keys.ObserveOn(Deployment.Current.Dispatcher).Subscribe(evt => webBrowser1.Navigate(new Uri(„http://en.wikipedia.org/wiki/“+ Search.Text)));

O autorovi – Igor Kulman

-Som absolventom softvérového inžinierstva na MFF UK v Prahe a aktuálne pracujem ako Windows Phone 7 vývojár vo firme Inmite. V minulosti som pôsobil v oblasti systémovej integrácie pre korporátnych zákazníkov. Mám skúsenosti s vývojom aplikácií na platformách .NET a PHP a v súčasnosti smerujem k Azure a Windows 8. Svoje názory publikujem na blogu, zopár článkov nájdete aj na Zdrojáku alebo v starších číslach magazínu PC Revue.

Igor Kulman

4 komentáře

  1. Zajimavy navod, urcite vyzkousim :)

    Jen pozor na preklep: … Kód, ktorý každých 4 minút … Interval = TimeSpan.FromMinutes(1) };

  2. Som rád, že aspoň 1 človek to pochopil

  3. steelspace (neregistrovaný)

    Rx je opravdu chytrá věcička, pro asynchronní GUI ideální.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *