Forum » Programiranje » Android threadi in asynctaski
Android threadi in asynctaski
detroit ::
Pozdravljeni
zanima me kako vi naredite sledeče:
imam asynctask
Kako bi v doInBackground izvedel en asinhron klic in ko bi dobil odgovor bi klical še postExecute?
Hvala
zanima me kako vi naredite sledeče:
imam asynctask
Kako bi v doInBackground izvedel en asinhron klic in ko bi dobil odgovor bi klical še postExecute?
Hvala
Skero
GupeM ::
onPostExecute se kliče samodejno ko se konča doInBackground.
torej:
torej:
protected Object doInBackground(...) { klicNekeMetode(); } protected void onPostExecute(Object result) { // Ta metoda se samodejno kliče ko se konča doInBackground() // Argument ki ga onPostExecute sprejme mora biti istega tipa kot ga doInBackground vrača če se ne motim. }
detroit ::
klicNekeMetode je async poleg tega pa doInBg rabi še return Object v tvojem primeru...
Je možno da jst ne razumem sicer...
Je možno da jst ne razumem sicer...
Skero
Mavrik ::
Tale tvoj napol-slovenski/napol-krneki opis problema in želj nam ne pove nič. KAJ TOČNO ti dela problem pri konceptu AsyncTaska? Kaj bi naj pomenilo "klicNekeMetode je async"? A ni to kar hočeš?
Daj napiši kaj te tare kot človek prosim no.
Daj napiši kaj te tare kot človek prosim no.
The truth is rarely pure and never simple.
detroit ::
pa začnimo še enkrat
imam async task in v samem doInBackground bi rad izvedel asinhron klic query na nek servis in potem ko dobim rezultate še par klicev servisov. Kako poklicati post execute ko so vsi končani. Kaj bolj razumljivo?
imam async task in v samem doInBackground bi rad izvedel asinhron klic query na nek servis in potem ko dobim rezultate še par klicev servisov. Kako poklicati post execute ko so vsi končani. Kaj bolj razumljivo?
Skero
shadeX ::
Kako poklicati post execute ko so vsi končani
onPost execute ti nemoreš klicati direktno. onPostExecute() se kliče sam, kadar je doInBackground končan.
Zgodovina sprememb…
- spremenil: shadeX ()
detroit ::
razumem to:)
ampak kot sem rekel je tukaj v akciji še več threadov (asinc query callov na rest service). Kako "končaš" doInBackground ko se vsi izvedejo?
ampak kot sem rekel je tukaj v akciji še več threadov (asinc query callov na rest service). Kako "končaš" doInBackground ko se vsi izvedejo?
Skero
detroit ::
Več kot očitno ne razumem dovolj da bi razložil dovolj enostavno.
Primer:
V doInBackground kličem še recimo 100 querijev na bazo zaporedno. Kako prepričat doInBackground da se konča ko se vsi izvedejo. Ne pozabimo da tukaj ne gre za navadne zaporedne klice ukazev ampak mrežo ainshronih klicev na bazo. Torej nikoli ne veš kateri konča zadnji.
Moje izkušnje s tem so da če imaš recimo
se kliče klicNaBazo... in potem takoj za tem vrne void. Ne čaka na rezultat klicNaBazo
Upam, da sem sedaj razložil dilemo
Primer:
V doInBackground kličem še recimo 100 querijev na bazo zaporedno. Kako prepričat doInBackground da se konča ko se vsi izvedejo. Ne pozabimo da tukaj ne gre za navadne zaporedne klice ukazev ampak mrežo ainshronih klicev na bazo. Torej nikoli ne veš kateri konča zadnji.
Moje izkušnje s tem so da če imaš recimo
void doInbackground() { klicNaBazoKiVrneTabeloSKateroPotemKličeDrugStrežnikKotParameter ITD.... return void; }
se kliče klicNaBazo... in potem takoj za tem vrne void. Ne čaka na rezultat klicNaBazo
Upam, da sem sedaj razložil dilemo
Skero
boogie_xlr ::
Mislim da razumem njegov problem.
protected void doInbackground() { doNekiAsync(); //se izvede asinhrono doNekiDrugaAsync(); //se izvede asinhrono return void; } protected void onPostExecute(Object result) { //se izvede ko se doInbackground() konča -> normalno //želi pa, da se izvede šele, ko se končajo tudi doNekiAsync() in doNekiDrugaAsync() }
detroit ::
hvala:D tako ja, mogoče še kanček bolj kompleksno ker se kliče še dosti drugih async metod v prvo nivojskih async metodah.
Skero
Mavrik ::
Okej, torej maš probleme z REST APIjem. A se ti da pokazati knjižnico, oz. API kako se asnyc klici kličejo? Namreč najti moraš način kako počakaš na njih znotraj doInBackground().
The truth is rarely pure and never simple.
detroit ::
ok recimo tole bi klical v doInBackground (http://developers.arcgis.com/en/android...
layer.queryIds(query, new CallbackListener<int[]>() { @Override public void onCallback(int[] arg0) { notri še par teh querijev recimo } }
Skero
Mavrik ::
Uporabi ConditionVariable in blokiraj izvajanje do callbacka (pa poskrbi da ne boš obesil aplikacije ob napakah).
The truth is rarely pure and never simple.
DuleKrtola ::
Sej je dost trivialno. Ko narediš in poženeš novTask greš v do{} while(!novTaskIsCompl33t). Loh vtekneš še kašn Thread.sleep(10) v zanko.
detroit ::
DuleKrtola ne razumem tvojega pristopa.
Kako bi ti v "do" dal async klic, ki ga moraš klicat v bistvu samo enkrat. In kako bi potem s tem pristopom (pa pustimo thread sleep, to ne spada v nobeno kodo:D) ustavil doInBackground izvajanje in potem klicali za zaključek return (v doInBackground). Kak primer bi bil fajn. Hvala
Kako bi ti v "do" dal async klic, ki ga moraš klicat v bistvu samo enkrat. In kako bi potem s tem pristopom (pa pustimo thread sleep, to ne spada v nobeno kodo:D) ustavil doInBackground izvajanje in potem klicali za zaključek return (v doInBackground). Kak primer bi bil fajn. Hvala
Skero
DuleKrtola ::
Ne vem kako si iz mojega posta razbral, da moraš pognat task iz while zanke. Valda ga poženeš samo enkrat, potem pa periodično čekiraš kdaj se je končal.
detroit ::
Ok. Upam da sem prav dognal (mi thread sleepi sicer niso ravno najbolj "rožnata" stvar)
do( preveri če so vsi threadi končani; thread.sleep;) while (!vsiThreadiKončani) če te prav razmem
do( preveri če so vsi threadi končani; thread.sleep;) while (!vsiThreadiKončani) če te prav razmem
Skero
DuleKrtola ::
preveri če so vsi threadi končani
tega ne rabiš, to dela tisti pogoj v while(). V do{} ne rabiš delat nič, tisti sleep je optional. TBH ne vem kako je v JAVI, ampak včasih smo v Cju morali zaklepat memory, ki ga je nucalo več thredov, zato sleep, da nisi stalno lockal s threadom, ki ne rabi bit real time in komot čaka par ms tu pa tam.
Kocka ::
Še ena ideja: V AsyncTasku zaženeš nove threade, ki izvršujejo posamezne querije, zatem pa pokličeš vse Thread.join() funkcije vseh threadov, ki si jih zagnal. Ob vsakem klicu join funkcije bo AsyncTask-ov thread čakal toliko časa, da se klicani thread konča. Ko se izvrši zadnji klic join funkcije bo to pomenilo, da so se vsi threadi izvršili do konca in se AsyncTask lahko konča.
Nekako takole:
Nekako takole:
protected void doInbackground() { task1 = new Thread(query1)... task1.start(); //se izvaja asinhrono task2 = new Thread(query2)... task2.start(); //se izvaja asinhrono task1.join(); // tu čakaš, dokler se task1 ne konča task2.join(); // tu čakaš, dokler se task2 ne konča return void; } protected void onPostExecute(Object result){ ... }
Zgodovina sprememb…
- spremenil: Kocka ()
detroit ::
join bo pravzaprav prisilil doInBackground da ne returna dokler se task2 ne konča? fenomenalno in enostavno se sliši. Zgleda super, sem ravno začel z androidom in ... očitno imam še dosti za prebrat. Hvala!
Skero
Kocka ::
Kocka ::
Sem našel še boljšo varjanto: namesto da kreiraš nove Threade, kreiraj nove AsyncTaske in potem namesto join() funkcije kličeš njihove AsyncTask.get() funkcije. Get() v AsyncTasku je enako kot join() v Threadu.
protected void doInbackground() { AsyncTask1 t1 = new AsyncTask(); AsyncTask1 t2 = new AsyncTask(); t1.execute(); t2.execute(); t1.get(); t2.get(); }
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [UWP] [C#]Oddelek: Programiranje | 4167 (2197) | BivšiUser2 |
» | [Android] setText iz AsyncTaskOddelek: Programiranje | 839 (756) | golobich |
» | [Android]Cudno obnasanje aplikacije in emulatorjaOddelek: Programiranje | 1302 (1131) | KernelPanic |
» | [Android] Parsanje XMLjaOddelek: Programiranje | 701 (557) | kunigunda |
» | [Android] končanje threadaOddelek: Programiranje | 915 (765) | Mavrik |