Hirdetés
- Milyen billentyűzetet vegyek?
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- Projektor topic
- Mini-ITX
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Házimozi haladó szinten
- Forrasztásról mindent az alapoktól!
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Milyen videókártyát?
- Bluetooth hangszórók
Új hozzászólás Aktív témák
-
thon73
tag
válasz
pittbaba
#529
üzenetére
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.)))
Új hozzászólás Aktív témák
- 8000 nit, maradhat? A szaúdiaknál kezd a Honor 600 Pro
- Samsung Galaxy Z Fold7 - ezt vártuk, de…
- Milyen billentyűzetet vegyek?
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- Vicces képek
- Kerti grill és bográcsozó házilag (BBQ, tervek, ötletek, receptek)
- Óra vagy karperec? Egészségügyi mindenes!
- Samsung Galaxy S26 Ultra - fontossági sorrend
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- További aktív témák...
- ÁR ALATT "RTX 4090" GARANCIÁLIS GAMER LAPTOP! - i7-13700HX, RTX 4090, 32GB DDR5, 1TB SSD
- Stellar Blade PS5 / 1x kijátszott / Alza vásárlás
- MSI MPG 271QRX QD-OLED 360Hz 1440p Gamer Monitor Garanciás 2027.12.03-ig
- Samsung Galaxy S23 Ultra 512GB,Újszerű,Dobozaval,12 hónap garanciával
- Apple iPhone 15 Plus 256GB,Újszerű,Dobozaval,12 hónap garanciával
- LG UltraGear 27GP850-B IPS Monitor! 2560x1440 / 165Hz / 1ms / G-Sync / FreeSync
- ÁRGARANCIA!Épített KomPhone i5 14600KF 32/64GB RAM RTX 5060Ti 16GB GAMER PC termékbeszámítással
- Apple iPhone 13 / 256GB / Kártyafüggetlen / 12Hó Garancia / Akku: 100%
- 27% - Lenovo Legion R27qe IPS Monitor! 2560x1440 / 180Hz / 0.5ms / FreeSync
- Asus ROG Destrier Ergo gamerszék
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest

