» »

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
Skero

GupeM ::

onPostExecute se kliče samodejno ko se konča doInBackground.

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...
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.
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?
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?
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
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.

detroit ::

eko bom prebral več o tem hvala za namig
Skero

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
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
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.

detroit ::

Hvala vsem za info
Skero

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:
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 ::

detroit je izjavil:

join bo pravzaprav prisilil doInBackground da ne returna dokler se task2 ne konča?

Ja, točno to. Če pa se je task2 med čakanjem na task1 že prej končal, pa bo task2.join takoj skočil ven in čakal na naprimer task3 oz zaključil doInBackground, če je bil ta zadnji.

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[UWP] [C#]

Oddelek: Programiranje
423991 (2021) BivšiUser2
»

[Android] setText iz AsyncTask

Oddelek: Programiranje
7787 (704) golobich
»

[Android]Cudno obnasanje aplikacije in emulatorja

Oddelek: Programiranje
71234 (1063) KernelPanic
»

[Android] Parsanje XMLja

Oddelek: Programiranje
9646 (502) kunigunda
»

[Android] končanje threada

Oddelek: Programiranje
6859 (709) Mavrik

Več podobnih tem