Forum » Programiranje » [Java] "Uničenje" objekta ?
[Java] "Uničenje" objekta ?
shadeX ::
Sicer C++ jezika ne znam, ampak vem da tam moraš sam sprostiti objekt iz "spomina". Za to obstaja posebna sintaksa.. npr:
Pri javi Garbage Collector to naredi zate, seveda ko ugotovi da tistega objekta neboš več potreboval, tako da java nima neke posebne sintakse za tole.
Malo sem razmišljal. A bi bilo isto, da bi "uničili" objekt sami, če naredimo npr tako:
A nebi s tem spustili objekt "janez" iz spomina in tako pridobili na RAM-u ?
object *obj=new object; delete obj;
Pri javi Garbage Collector to naredi zate, seveda ko ugotovi da tistega objekta neboš več potreboval, tako da java nima neke posebne sintakse za tole.
Malo sem razmišljal. A bi bilo isto, da bi "uničili" objekt sami, če naredimo npr tako:
Oseba janez = new Oseba(); // janez sedaj drži referenčno številko v spominu janez = null; // janez, nima več referenčne številke
A nebi s tem spustili objekt "janez" iz spomina in tako pridobili na RAM-u ?
- spremenil: shadeX ()
Arto ::
Java ima garbage collection, kar preprosto povedano pomeni, da zbriše objekte, ki niso več v uporabi (ni več nobene reference nanje). Se pravi, kar si naredil bi po moje delovalo, ampak ne nujno takoj, temveč ko se bo garbage collector odločil, da ga odstrani.
shadeX ::
Aha..
Ker ubistvu imam en problem in sicer pri androidu, in bom kar povedal zakaj se gre.
1. Imam Handler objekt v Service razredu.
2. na handler objekt kličem postDelayed ( ko pride do določene situacije se kliče postDelayed, ki čez X sekund požene kodo )
3. Če uporabnik želi ustaviti aplikacijo s pritiskom na gumb, moram ustaviti tudi handler objekt, če ne se bo koda izvršila ( če je že v odštevanju )
4. Ker sem handler ustvaril v Service razredu, nimam reference v mojem activitiju do njega.
5. Tako sem ustvaril statičen handler in mu pripisal tisti handler objekt
6. Sedaj imam referenco do handler objekta iz Service razreda v activity razred in lahko kličem handler.removeCallbacks(runnable)
7. Handler se ustavi ( če je v pogonu )
8. Skrbi me pa memory leak, tako da bi na onDestroy (activitija ), pripisal statičnemu handlerju , null.
Bi rešil problem?
Ker ubistvu imam en problem in sicer pri androidu, in bom kar povedal zakaj se gre.
1. Imam Handler objekt v Service razredu.
2. na handler objekt kličem postDelayed ( ko pride do določene situacije se kliče postDelayed, ki čez X sekund požene kodo )
3. Če uporabnik želi ustaviti aplikacijo s pritiskom na gumb, moram ustaviti tudi handler objekt, če ne se bo koda izvršila ( če je že v odštevanju )
4. Ker sem handler ustvaril v Service razredu, nimam reference v mojem activitiju do njega.
5. Tako sem ustvaril statičen handler in mu pripisal tisti handler objekt
6. Sedaj imam referenco do handler objekta iz Service razreda v activity razred in lahko kličem handler.removeCallbacks(runnable)
7. Handler se ustavi ( če je v pogonu )
8. Skrbi me pa memory leak, tako da bi na onDestroy (activitija ), pripisal statičnemu handlerju , null.
Bi rešil problem?
kunigunda ::
Ce bos dal null, bo kr ok, s tem zbrises referenco (ce ga kje drugje se ne drzi)
Drgac pa itak k bos novmu objektu prepisal, bo starega unicil. ne rabis bat v javi je kr dobra glede tega
Drgac pa itak k bos novmu objektu prepisal, bo starega unicil. ne rabis bat v javi je kr dobra glede tega
Zgodovina sprememb…
- spremenilo: kunigunda ()
shadeX ::
Aha, ok pol pa ok.
Sicer javi zaupam, ampak glede teh statičnih metod se bojim , kr veliko berem da kršijo OOP, pa niso priporočljive itd.
Sicer javi zaupam, ampak glede teh statičnih metod se bojim , kr veliko berem da kršijo OOP, pa niso priporočljive itd.
shadeX ::
http://javarevisited.blogspot.com/2011/...
Prvi hit na googlu glede Java GCja.
Hvala. Odlično branje.
Nicesar ne krsijo glede OOP.
Maja s statični metodami izgubiš dedovanje s tem pa tudi casting..itd
boolsheat ::
Statične metode imajo svoj namen, bodi pozoren, kako jih uporabljajo programerji Java standardne knjižnjice.
Npr.:
System.out.println()
Math.abs()
Evo to je tipičen primer:
http://docs.oracle.com/javase/1.4.2/doc...
Tako, da mirno lahko uporabljaš statične metode, če veš za kaj.
Npr.:
System.out.println()
Math.abs()
Evo to je tipičen primer:
http://docs.oracle.com/javase/1.4.2/doc...
Tako, da mirno lahko uporabljaš statične metode, če veš za kaj.
user4683 ::
To ni pravi način za komunikacijo s serviceom. Pravi način bi bil s ServiceConnection.
Nekako takole:
Activity:
Service:
Sedaj lahko recimo iz tvojega activity-ja dostopas do service-a:
Final words.. V tvojem primeru morda niti ne rabiš klicati nobene metode na serviceu (da ustaviš handler). Ker če s serviceom ni vzpostavljena nobena povezava (ustvarjena z bindService in uničena z unbindService), se service avtomatično uniči (se kliče onDestroy, kjer lahko poskrbiš za handler). V zgornjem primeru to drži, saj v onStop activityja uničimo (edino) povezavo na service.
Nekako takole:
Activity:
private MyService myService = null; @Override protected void onStart() { super.onStart(); bindService(new Intent(this, MyService.class), myServiceConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); if (isServiceBound) { unbindService(myServiceConnection); isServiceBound = false; } } private ServiceConnection myServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { myService = ((MyService.LocalBinder) service).getService(); isServiceBound = true; } @Override public void onServiceDisconnected(ComponentName className) { myService = null; } };
Service:
public class MyService extends Service { //... public class LocalBinder extends Binder { public MyService getService() { return MyService.this; } } public void hi() { Log.v("MyService", "Hello from service!"); } }
Sedaj lahko recimo iz tvojega activity-ja dostopas do service-a:
myService.hi();
Final words.. V tvojem primeru morda niti ne rabiš klicati nobene metode na serviceu (da ustaviš handler). Ker če s serviceom ni vzpostavljena nobena povezava (ustvarjena z bindService in uničena z unbindService), se service avtomatično uniči (se kliče onDestroy, kjer lahko poskrbiš za handler). V zgornjem primeru to drži, saj v onStop activityja uničimo (edino) povezavo na service.
shadeX ::
@znupy
Problem sem rešil z bindanjem service-a, tako kot si mi pokazal. Mučas gracias :D
Glede zadnjega odstavka, ki si ga napisal imaš popolnoma prav. Lahko bi na onDestroy servic-a klical uničenje handlerja, ampak problem nastane da onDestroy se ne kliče če je service že uničen.
Pač imam kodo, ki pod določenimi pogoji ustavi tudi service. ( brezvezno zapravljanje CPU , če laufa skoz - v mojem primeru ) Ampak če je handler zagnan in se odšteva ( x časa do zagona ), potem drugače kot tako kot si mi pokazal handlerja ne morem ustaviti :D
Uglavnem, problem rešen.
Problem sem rešil z bindanjem service-a, tako kot si mi pokazal. Mučas gracias :D
Glede zadnjega odstavka, ki si ga napisal imaš popolnoma prav. Lahko bi na onDestroy servic-a klical uničenje handlerja, ampak problem nastane da onDestroy se ne kliče če je service že uničen.
Pač imam kodo, ki pod določenimi pogoji ustavi tudi service. ( brezvezno zapravljanje CPU , če laufa skoz - v mojem primeru ) Ampak če je handler zagnan in se odšteva ( x časa do zagona ), potem drugače kot tako kot si mi pokazal handlerja ne morem ustaviti :D
Uglavnem, problem rešen.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Android] ThreadOddelek: Programiranje | 1204 (981) | Spura |
» | C# in servisiOddelek: Programiranje | 1104 (664) | mihies |
» | [c#] Risanje z miškoOddelek: Programiranje | 1434 (1115) | japol |
» | [JAVA] zaustavitev niti (threadov)Oddelek: Programiranje | 3184 (3184) | morbo |
» | [C++] for {}Oddelek: Programiranje | 1721 (1415) | Gundolf |