Symbiatch - maailma on rikki

Symbian-ohjelmointia, osa 2

31.01.2006 09.27 - mobiili ohjelmointi 

Yksi iso osa Symbiania on asynkronisuus. Kaikki mitä normaalisti olet tottunut tekemään synkronisesti sujuu paljon vaikeammin Symbianissa. Esimerkiksi jos haluat ladata JPEG-kuvan, normaalisti sinun tarvitsee vain pyytää konversiomodulia lataamaan kuva ja saat sen paluuarvona. Tämä olisi liian helppoa, joten Symbianissa asiat tehdään toisin.

Jos haluat ladata kuvan, sinun täytyy ensin luoda konversio-olio. Sen jälkeen sinun täytyy kertoa sille minkä kuvan haluat ladata. Tämä metodi palautuu heti, mutta kuvaa ei ole vielä ladattu. Se on vain mennyt jonoon ja hoidellaan joskus. Nyt sinun täytyy odottaa takaisinkutsua, jossa kerrotaan kuvan olevan auki. Sen jälkeen pyydät purkamaan kuvan, tämäkin kutsu palautuu heti, mutta kuva puretaan taustalla ja saat tästäkin takaisinkutsun.

Eli jos vain haluat ladata kuvan ja näyttää sen ruudulla, joudut odottelemaan sitä hetkeä kun Symbian päättää sen tehdä. Et voi suoraan vain jäädä odottelemaan kuvaoliota ja sen jälkeen piirtää sitä ruutuun. Se olisi liian käyttäjäystävällistä.

Sama koskee kameraa. Ensin sinun pitää varata kamera. Sen jälkeen takaisinkutsussa käynnistää kamera. Sen takaisinkutsussa voit sitten asettaa parametrit ja vaikka käynnistää esikatselun. Entä jos et haluakaan heti esikatselua, mutta vähän myöhemmin? Sinun pitää rakentaa monimutkainen seurantajärjestelmä, josta tiedät onko kamera jo valmis vai ei.

Oletan että tällaisilla järjettömän runsailla asynkronisuuksilla on haettu sitä, että käyttöliittymä pysyy koko ajan käytettävänä eikä sovellus näennäisesti jumitu, jos vaikka kuvan muunnoksessa meneekin sekunti tai pari. Olisi kuitenkin "ihan kiva", jos voisi itse valita käytetäänkö asynkronisuutta vai tehdäänkö asia synkronisesti. Varsinkin kun nykylaitteissa nämä kutsut eivät kestä kovinkaan kauaa.

Kommentoi

Lisää kommentti

Nimi:
Email:
Kotisivu:
Kotisivu:
Kommentti:

Kommentit

janza (anon, 01.02.2006 08.01)

Aloittelevakin ohjelmoija saa asynkronisesta rajapinnasta tehtyä synkronisen version, mutta teepä synkronisesta asynkroninen.

Mobiilivehkeissä on tuota CPU:ta hieman vähemmän käytössä kuin desktopissa, joten on ihan loogista ettei koko laite jumahda kun aletaan dekoodata sitä 3 megapikselin JPEGiä. Windowsissahan moni aplikaatio ei suostu edes päivittämään UI:taan jos on tekemässä jotain pitkäkestoista operaatiota. Siinä sitten ihmetellään että kuoliko softa vai onko se vain tekemässä jotain...

Symbiatch (03.02.2006 12.53)

Kyllähän sitä aloittelijakin tekee perus-synkronoinnin, mutta se vaatii silti lisäluokkia ja muuta mukavaa. Esimerkiksi jos kuvia lataillaan, tulevat kutsut aina samoihin metodeihin, joten joudutaan ylläpitämään tilatietoja monista asioista.

Vaihtoehtoinen synkroninen/asynkroninen valittavalla takaisinkutsulla olisi paljon parempi. Voisi helpommin määritellä mitä tehdään kun homma on valmis. Nykyinen tapa suosii miljoonia luokkia, joka ei välttämättä ole ollenkaan järkevää.

janza (anon, 06.02.2006 08.29)

Kuulosta siltä että olet laiska ohjelmoija etkä halua tehdä asioita "oikein". Onneksi asynkroniset API:t opastavat sinua kuitenkin valoon :)

Symbiatch (06.02.2006 09.59)

Minäkö laiska? Ei suinkaan. Kaipaisin vain vähintään asetettavia takaisinkutsuja. Esimerkiksi CPeriodic hyväksyy vapaasti valittavan takaisinkutsun, miksei tässäkin käytetä vastaavaa? On hyvin rajoittavaa vaatia ohjelmoijaa tekemään miljoonia luokkia, joista sitten viitataan sinnetännetuonne että saadaan data kasaan. Tai sitten tehdään monimutkaisia tilakoneita.

Helpompaa olisi vain käskeä ladata kuva ja kutsua funktiota X kun on valmis, jos asynkroniaa haluaa. Nykyinen malli ei toimi mitenkään järkevästi, jos esimerkiksi halutaan ladata 20 kuvaa, joita tarvitaan ensimmäisessä ruudussa. Siinä sitten käydään listaa läpi ja odotellaan että systeemi hoitaa hommat ja väännellään tilakoneita eestaas että saadaan ne kuvat oikeisiin olioihin menemään. Ei ollenkaan ohjelmoijaystävällistä.

janza (anon, 07.02.2006 08.07)

No olisit heti sanonut että haluaisit itse määritellä takaisinkutsufunktion! Alkuperäisessä artikkelissa tunnuit kaipaavan synkronista rajapintaa. Ok, ehkä olisi kiva että voisi antaa parametrinä TCallBack:in mutta kyllä sen käyttäminen oikesti olisi vielä tuskallisempaa, kun takasinkutsun pitäisi olla staattinen funktio...

En ymmärrä mitä tarkoitat tällä: "On hyvin rajoittavaa vaatia ohjelmoijaa tekemään miljoonia luokkia"? Yleensähän se takaisinkutsu on määritetty abstraktissa luokassa, josta sitten periytät oman luokkasi ja toteutat takaisinkutsun. Ei sitä varten tarvitse kokonaista uutta luokkaa "tehdä".

Jutut.fi  |  Omat jutut  |  Muiden jutut  |  Kategoriat  |  kirjaudu