Hirdetés

Új hozzászólás Aktív témák

  • pittbaba
    aktív tag

    Egyáltalán nem hülyeség. A legnagyobb gond az AsyncTask-ban, hogy a hívó Activity és az AsyncTask külön léteznek. Pl. indításkor még nem létezik AsyncTask; míg a készülék elfordításakor - átmenetileg - az Activity tűnik el. Valamilyen módon tudnia kell mindkét folyamatnak, hogy létezik-e a másik.
    A timeConsumingTask valójában egy "változó", vagy C-beli fogalommal mutató, mely az elindult TimeConsumingTask típusú példányra mutat. Ha ennek null értéket adunk, attól a példány még létezik, esetleg fut is, amíg a GC el nem tünteti. Első próbálkozásra kézenfekvőnek tűnt ezt a változót használni:
    - ha értéke null, akkor nincs futó AsyncTask (itt timeConsumingTask-ra bővítettük). Ezt fontos tudni, mert ilyenkor lehet csak pl. újra elindítani az AsyncTask-ot, különben több példány futna együtt, és keverednének az eredmények (nézd meg a log-ot az első próbálkozásoknál, ahol ez megtörténik: egyszerre több háttérfolyamat számol, függetlenül attól, hogy az Activity csak az egyikről "tud". A többit még nem takarította el a GC.)
    - ha értéke nemnull, akkor van éppen aktív háttérfolyamat, és az érték arra mutat.
    ((A C mutatóaritmetika nehéz, de sokkal jobban segít megérteni ezeket a folyamatokat.))
    Ki tudja, hogy a háttérszál befejeződött? Hát az onPostExecute metódus! (meg az onCancel is), tehát ők tudják "törölni" ezt a mutatót. Ez teszi lehetővé, hogy a háttérfolyamatot újra indítsuk (már amennyiben szükség van erre). ((De szükség lehet, mert a hibátlan lefutás csak annyit jelent, hogy a HÁTTÉRSZÁL hibátlanul futott! De a számítás nem biztos, hogy megfelelő eredményt adott, mert pl. egy file hiányzott!! Tehát újra kell számolni.))
    Azért tudod itt írni a timeConsumingTask változót, mert "belső" osztályként készült az AsyncTask rész. Egyébként is tudnád (ha public), csak pl. callerActivity.timeConsumingTask-ként. Korábbi eszmefuttatás alapján az onPostExecute idején az Activity-nak léteznie KELL, bár ezt azért mindig ellenőriztük.
    A későbbi megvalósításokban - mivel a timeConsumingTask null-ra állításával az abban tárolt (returnedResult) eredmény is elveszett - egy belső változó tájékoztatott a timeConsumingTask állásáról. ((Ilyen egyébként a task metódusai között is van, én - részben didaktikai okokból sajátot használtam, lehet még optimalizálni.)) A timeConsumingTask non-null értéke értéke azt jelentette: van már elindított (lehet, hogy befejezett) háttérszál, és a belső "state" változó tudta megmondani, hogy a futás befejezett-e v. sem. Ettől függetlenül a timeConsumingTask non-null értékét ellenőrizni kell, mert lehet, hogy még soha nem is indítottuk el, és emiatt nem is létezik (és akkor belső változói se léteznek, a programunk pedig - nem létező változó olvasásakor FC-t dob).
    Van fent egy PackageSave2 cikk is, abban pont egy már meglévő programot illesztettem bele az AsyncTask keretbe. A cikk tartalmazza az üres keretet is, sztem. abból érdemes tovább építkezni.
    Két fontos feladat van:
    1. Mindkét osztálynak figyelnie kell, hogy létezik-e a másik! (Ez nagyon fontos, ezen lehet elbukni)
    2. Gondoskodni kell arról, hogy csak egyetlen (vagy legalább ellenőrzött számú) AsyncTask futhasson egy időben. ((A korábban indítottak is tovább futnak, függetlenül attól, hogy a hivatkozásukat már lecseréltük))

    A triggerelést próbáltam, de mégis csak felesleges, mert amíg azt be nem fejezi az Activity, addig az onPostExecute sem fejeződhet be. (Voltaképp onnan hívjuk meg az Activity egy metódusát.) Inkább úgy kell szervezni a programot, hogy a Working-thread tényleg working-thread legyen, vagyis ott történjék a "munka", függetlenül attól, hogy egyes részei gyorsak vagy lassúak. Az Activity valójában csak egy indító keret lesz. Azt esetleg érdemes lenne megnézni, hogy ha az Activity-t meghívjuk egy másik Activity-ből, akkor a visszatérést hogyan lehet az onPostExecute-ba, vagy egy onnét triggerelt metódusba tenni. Ha előbb ki tudod próbálni, mint én, akkor mindenképp szólj, kérlek, mert nagyon érdekel!

    (((Volna még egy kérdésem, minimálisan off-topic: nem érdemes ezt a diskurzust áttenni a cikkek hozzászólásába? Ott bőven van hely bármilyen hosszú eszmefutattásra. Saját ellenvéleményem: magyar nyelven praktikusan itt van az egyetlen élő fórum (és legyünk büszkék rá!!), tehát érdemes itt megbeszélni a kérdéses pontokat. Még akkor is, ha egy ekkora téma, mint az AsyncTask, nem hogy egy fórumba, de még egy emészthető cikkbe se fér bele.)))

    Szia!

    Igen, ma fogok ott tartani gyakorlatban is, hogy a szebb megoldásokat is lépésről lépésre beépítem a programomba. Lesznek nehezítések még a cikked példájához képest, biztos, hogy fogok még kérdezni a témában. Saját adatbázisból próbálom lekérni a kiválasztott BKV járat legközelebb induló járatait. Mivel a legtöbb infót az offline sqlite db-ből szedi, viszont az érzékenyebb nagyobb lekéréseket már a netről, ezért kell nekem főleg az Async task, mivel az adatok egy részét (vonal neve, megállók) már kiírom kiválasztás után rögtön, de lehet az internetről szerzett adatok csak később érkeznek meg és íródnak ki. Szerintem itt jogos az AsyncTask használata. Viszont mi van, ha éppen nem sikerül neki számomra megfelelő adattal visszatérni, mert mondjuk pont nem kapaszkodott fel a wifi? Azt is kezelnem kellene. Illetve, ha elmúlt az adott időpont (elment a következő járat ) akkor újra csináljon egy lekérést, már a frissebb indulási időpontokkal visszatérve, valahogy rá kell vegyem, hogy a háttérben emberi időközönként frissítsen.

    A konkrét kérdésemre is megkaptam a választ, annyi volt a gond, amire számítottam is, osztálynévvel ki kellett egészítenem a változónevet, így már látja a változót, nem ír hibát! (van egy temérdek hiányosságom Javaból, PHP-ban dolgozom, nehéz átállni és néha csak úgy nem akar jönni a megoldás)

    A cikk kapcsán felmerült egy kérdés: Az érték megőrzése ha bezárult az alkalmazás dolog írtad, hogy a példádban már lejárt. Mikor várható leírás ennek az újabb verziójáról? Fragmentekre kell rákeresnem? Ott lesz a megoldás?

    A téma áthelyezése szerintem úgy lenne a legetikusabb mindenki számára, ha innen a diskurzus részeit néha bemásolod a cikked alá is. Mivel valóban ez az egyetlen magyar fórum itt van, hagy legyen meg itt is az érdeklődők számára, hasznos lesz ez egy év múlva, ha már többen mennek neki az Android home fejlesztésnek.

Új hozzászólás Aktív témák