» »

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

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?

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

Zgodovina sprememb…

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.

kr?en ::

http://javarevisited.blogspot.com/2011/...

Prvi hit na googlu glede Java GCja.

kunigunda ::

Nicesar ne krsijo glede OOP.

shadeX ::

kr?en je izjavil:

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

kunigunda ::

Zato pa obstaja razlika med staticnimi in objektnimi metodami.

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.

znupy ::

To ni pravi način za komunikacijo s serviceom. Pravi način bi bil s ServiceConnection.

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.


Vredno ogleda ...

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

[Android] Thread

Oddelek: Programiranje
8820 (597) Spura
»

C# in servisi

Oddelek: Programiranje
7791 (351) mihies
»

[c#] Risanje z miško

Oddelek: Programiranje
221024 (705) japol
»

[JAVA] zaustavitev niti (threadov)

Oddelek: Programiranje
222521 (2521) morbo
»

[C++] for {}

Oddelek: Programiranje
291309 (1003) Gundolf

Več podobnih tem