Hirdetés
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- gban: Ingyen kellene, de tegnapra
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- GoodSpeed: Samsung Galaxy A56 5G
- sziku69: Fűzzük össze a szavakat :)
- GoodSpeed: Philips AWP9820 (vízlágyító) Calgon helyett?
- Tóth Olivér: Kedvenc processzorok:
- Luck Dragon: Alza kuponok – aktuális kedvezmények, tippek és tapasztalatok (külön igényre)
- Luck Dragon: Asszociációs játé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
Hirdetés
- Bakelit, Vinyl lemezjatszó
- Okos Otthon / Smart Home
- Gyúrósok ide!
- Megjöttek Magyarországra a Redmi Note 15-ök, január 22-től ennyiért kaphatók
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- Steam topic
- Kerékpárosok, bringások ide!
- Battlefield 6
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- World of Warships
- További aktív témák...
- Microsoft Xbox Series S 512GB , 2 kontroller Venom aksikkal
- CSERE IS! Xiaomi Redmi Note 13 Pro+ 5G 8/256 Aurora Purple
- Eladó PDP Riffmaster Wireless Guitar Controller PS5, PC
- Acer Nitro ANV15-51 15.6" FHD IPS i9-13900H RTX 4060 16GB 512GB NVMe gar
- Nintendo Switch utazó, puha, kemény tokok gyári, Mario, Splatoon, Hori, Spigen
- Xiaomi Redmi Note 14 Pro+ 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
- HIBÁTLAN iPhone 13 128GB Midnight-1 ÉV GARANCIA - Kártyafüggetlen, MS4397
- Akció! Gamer PC-Számítógép! Intel Ultra 5 245K / RTX 3080 10GB / 16GB DDR5 / 1TB SSD!
- HIBÁTLAN iPhone 13 Pro Max 256GB Sierra Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3958
- BESZÁMÍTÁS! ASROCK H510M i5 11400F 16GB DDR4 1TB SSD RTX 4060 8GB Zalman S2 TG Cooler Master 650W
Állásajánlatok
Cég: Central PC számítógép és laptop szerviz - Pécs
Város: Pécs
Cég: Laptopműhely Bt.
Város: Budapest

