Forum » Programiranje » [Android] Ustavitev handlerja
[Android] Ustavitev handlerja
shadeX ::
pozdrav!
Imam kodo, ki jo s pomočjo handlerja lahko izvršim nekje v prihodnosti. Če pride do določenih okoliščin bi rad preprečil izvršitev te kode. Za to obstaja nekaj metod ki jih handler objekt ima.
Npr: handler.removeCallbacks(runnable), ali recimo handler.removeMessages(0).
Tukaj nastane malo zmeden problem. Preizkusil sem ti dve metodi v novem blank projektu na onCreate activitju z gumbom "start handler" in "stop handler". Če pritistnem start in nato stop, se handler ne bo izvedel..tako da definitivno sti te dve metodi eni izmed pravilnih ki ustavijo handler..
tukaj pa nastane težava. imam namreč 5 razredov. En razred je Broadcast (subclass Broadcast reciverju ). Tam imam handler kodo. Se pravi, onReceive (ki ga mimogrede pošilja service ), program naredi določene stvari. Če pride do kakšnih posebnih razmer zažene handler čez X časa. Koda vse deluje kot mora, vendar če želim prekiniti da se koda v handlerju ne izvrši (naprimer, uporabnik izplicitno ustavi program ) , se to ne zgodi. Koda čez X časa deluje naprej...
zakaj mi metode za ustavitev handlerja ne delujejo v broadcast reciverju, v main activitiju pa ja??
Imam kodo, ki jo s pomočjo handlerja lahko izvršim nekje v prihodnosti. Če pride do določenih okoliščin bi rad preprečil izvršitev te kode. Za to obstaja nekaj metod ki jih handler objekt ima.
Npr: handler.removeCallbacks(runnable), ali recimo handler.removeMessages(0).
Tukaj nastane malo zmeden problem. Preizkusil sem ti dve metodi v novem blank projektu na onCreate activitju z gumbom "start handler" in "stop handler". Če pritistnem start in nato stop, se handler ne bo izvedel..tako da definitivno sti te dve metodi eni izmed pravilnih ki ustavijo handler..
tukaj pa nastane težava. imam namreč 5 razredov. En razred je Broadcast (subclass Broadcast reciverju ). Tam imam handler kodo. Se pravi, onReceive (ki ga mimogrede pošilja service ), program naredi določene stvari. Če pride do kakšnih posebnih razmer zažene handler čez X časa. Koda vse deluje kot mora, vendar če želim prekiniti da se koda v handlerju ne izvrši (naprimer, uporabnik izplicitno ustavi program ) , se to ne zgodi. Koda čez X časa deluje naprej...
zakaj mi metode za ustavitev handlerja ne delujejo v broadcast reciverju, v main activitiju pa ja??
Mavrik ::
Hmm... brez kode povem točno karkoli konkretnega. Razen edino: Handler je vezan na trenuten Thread, a slučajno izvajaš kodo za preklic ali dodajanje sporočil na drugih threadih?
The truth is rarely pure and never simple.
shadeX ::
Na to sem tudi študiral ja. V dokumentaciji piše da je handler vezan na thread v kateremu prične z izvedbo.
Ma da bi vedel ne. Razen hm..
Če uporabnik pritisne tipko Menu ( koda je v main activitju ) in izberem Izhod, tam kličem moj Broadcast constructor ( brez argumentov ), ki nato kliče kodo za ustavitev handlerja.
Tukaj je koda razreda Broadcast ( Komentarje sem dodal in izbisal nepotrebno kodo, zaradi preglednosti )
To je pa v main activitiju koda za izhod iz programa
Ma da bi vedel ne. Razen hm..
Če uporabnik pritisne tipko Menu ( koda je v main activitju ) in izberem Izhod, tam kličem moj Broadcast constructor ( brez argumentov ), ki nato kliče kodo za ustavitev handlerja.
Tukaj je koda razreda Broadcast ( Komentarje sem dodal in izbisal nepotrebno kodo, zaradi preglednosti )
// No argument constructor public Broadcast() { if(handler != null) { cancelHandler(); } else { Log.e("BROADCAST", "Handler NULL"); } } public void cancelHandler() { handler.removeCallbacks(run); Log.e("BROADCAST", "HANDLERSTOPPED"); } public void onReceive(Context context, Intent intent) { Log.e("ON RECEIVE", "On receive executed"); // KODA KI SE IZVRŠI ON RECEIVE Log.e("From reciver", "userdefined var "+userDefined+" rssi from service "+rssiFromService); if(rssiFromService < userDefined &&/*Value that user enters*/rssiFromService != -200) { /* If android version is highier or equal to API level 9 (gingerbread)*/ if(android.os.Build.VERSION.SDK_INT >= 9) { // SPET KODA } // end of IF statement // stop running service con.stopService(intentt); //handler = new Handler(); // start counting time ( userDef3Act ) - code executes only once ( depends on userdef3act variable for how long delay is) handler.postDelayed(run, userDef3gAct); } // end IF Runnable run = new Runnable() { @Override public void run() { threeG = false; con.startService(intentt); manage3g_OS2_3(); wifiManager.setWifiEnabled(true); Log.e("HANDLER", "HANDLER IS RUNNING"); } }; }
To je pa v main activitiju koda za izhod iz programa
@Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch(item.getItemId()) { case R.id.exitApp: checkHandler = false; new Broadcast(); stopService(intentt); finish(); return true; default: return super.onOptionsItemSelected(item); } }
shadeX ::
ok po 2 dneh zajebavanja sem rešil zadevo.
1. jaz noob sem šel na izhod delat nov objekt ( new Broadcast(); ). Logično da mi ni ustavilo handlerja ker je bil to drug handler in ne tisti ki bi kodo "pognal"
2. v main activitju sem naredil samo nov handler objekt ( tako da sem lahko isti objekt v main activitju ustavil ). sedaj deluje..
1. jaz noob sem šel na izhod delat nov objekt ( new Broadcast(); ). Logično da mi ni ustavilo handlerja ker je bil to drug handler in ne tisti ki bi kodo "pognal"
2. v main activitju sem naredil samo nov handler objekt ( tako da sem lahko isti objekt v main activitju ustavil ). sedaj deluje..
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Android] ThreadOddelek: Programiranje | 1204 (981) | Spura |
» | [Android] Informacija iz Servic-a v Main ActivityOddelek: Programiranje | 970 (780) | i386 |
» | [Java] "Uničenje" objekta ?Oddelek: Programiranje | 1220 (912) | shadeX |
» | [android] vstavljanje slikeOddelek: Programiranje | 1247 (1144) | messi |
» | [JAVA] zaustavitev niti (threadov)Oddelek: Programiranje | 3183 (3183) | morbo |