Hirdetés
- 5 GHz körülre gyorsulnak a mobilchipek, a Huawei lemaradásban
- Motorola Edge 70 Fusion – stílusosan főznek
- Félő, hogy az okosszemüveg a szexuális zaklatók játékszere lesz
- Snapdragon 8 Elite Gen 5 és folyadékhűtés jöhet a RedMagic új gamer táblagépébe
- Nagyobb akkumulátorral jöhet a Motorola Razr 70 Ultra, másban alig változna
- Kiszivárgott az Oppo Find X9s Pro adatlapja
- Xiaomi 17 Ultra - jó az optikája
- Milyen okostelefont vegyek?
- Google Pixel topik
- Motorola Edge 70 Fusion – stílusosan főznek
- Mobil flották
- Félő, hogy az okosszemüveg a szexuális zaklatók játékszere lesz
- Honor Magic8 Pro - bevált recept kölcsönvett hozzávalókkal
- Samsung Galaxy S26 Ultra - fontossági sorrend
- Poco F8 Pro – titkos favorit lehet belőle
Ú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
- Kiszivárgott az Oppo Find X9s Pro adatlapja
- Azonnali alaplapos kérdések órája
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- VR topik
- Linux haladóknak
- Engedélyezte Hollandia a Tesla önvezetést, az EU többi része következhet
- Xiaomi 17 Ultra - jó az optikája
- E-roller topik
- Hogyan verte le egy telefon chip az egész laptop ipart? – x86 vs ARM
- További aktív témák...
- Nagyon olcsón! LG Ultrawide Cruved LED 34"VA 4k usb-c PD 65w Gari 2027.04.29-ig Olvass leírást!
- Eladó Onkyo TX-NR7100 házimozi erősítő hibátlan állapot, gyári dobozzal
- Klipsch R-120SW aktív mélynyomó eladó, hibátlan
- KLIPSCH R-600F 5.0 hangfalszett
- Micron 5200 ECO 480 GB 2,5 SATA Enterprise/Datacenter Server SSD
- AKCIÓS!! áthajtós érintős 360 szinteÚJ Dell 16 Plus 2-in-1 Ultra 7 258V Intel Arc 140V 32GB 1TB SSD
- Sok Extra! Playstation Portal 6 hó garancia, számlával!
- Bomba ár! Lenovo ThinkPad X12 Detachable i5-11G I 16GB I 512SSD I FHD+ Touch I Cam I W11 I Gari!
- Xbox Game Pass Ultimate előfizetések kedvező áron
- Új M5 MacBook Pro, 14", 10/10 mag, 32GB RAM, 1TB SSD, Silver - 27% ÁFA
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest

