# Lebensdauer BroadcastReceiver/Handler



## RelaX (9. Jan 2015)

Guten Abend,

ich hab da mal wieder ein kleines Problem und keine richtige Antwort gefunden. Leider.. Es geht um die Lebensdauer von BroadcastReceiver und würde zu gerne eure Meinung hören.

Folgende Situation ist zu bearbeiten:

Vom GUI-Thread aus versende ich Broadcasts zum DB-Thread, welcher wiederrum einen Broadcast mit der Antwort sendet. Das ganze funktioniert ganz gut und ich möchte das auch so beibehalten.

Jetzt zu meiner eigentlichen Frage bezüglich der Lebensdauer.

Wenn ich meinen BroadcastReceiver wie folgt erstelle, dann erhalte ich einen BroadcastRecevier welcher auch nach dem Empfangen von einem Broadcast erhalten bleibt und somit alle Broadcast die ankommen abarbeiten kann.


```
private void registerBroadCast() {
		IntentFilter inFi = new IntentFilter();
		inFi.addAction("RESULT");
		LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getApplicationContext());
		broadCastReceiver = new BroadcastReceiver()
		{
			@Override
			public void onReceive(final Context context, final Intent intent) {
				new Handler().post(new Runnable() {
					public void run() {
						if(intent.getAction().equals("RESULT")) {
							@SuppressWarnings("unchecked")
							Object inputs = (Object) intent.getExtras().get("inputs");
							readInputs(inputs);
						}
				    }
				});				
			}
		};
		lbm.registerReceiver(broadCastReceiver,inFi);
	}
```

Jetzt zur ersten Frage:
Durch den Aufruf von lbm.unregisterBroadcast(broadcastReceiver), zerstöre ich auch den Handler und ich vergeude keinen Speicher.

Jetzt zum Zweiten Teil meiner Frage:
Wenn ich nun den BroadCast wie folgt erstelle:


```
final BroadcastReceiver broadCastReceiver = new BroadcastReceiver()
		{
			@Override
			public void onReceive(final Context context, final Intent intent) {
				Object inputs = (Object) intent.getExtras().get("inputs");
							readInputs(inputs);
			}
		};
		lbm.registerReceiver(broadCastReceiver,inFi);
```

Dann muss ich aber trotzdem ein unregisterBroadcastReceiver(broadcastReceiver); aufrufen.


Bitte korrigiert mich wenn ich falsch liege aber der Handler verwirrt mich ein bisschen. Ist er überhaupt notwendig? Und wenn nein, wann wäre er notwendig?

Ich hab eben das Problem das ich manchmal einfach einen BroadcastReceiver brauche der genau ein Broadcast entgegennehmen kann und danach nicht mehr benötigt wird. Wenn ich einen Handler, wie beim ersten BroadcastReceiver, erstelle dann hab ich den Vorteil das ich noch in der run()-methode ein lbm.unregisterBroadcastReceiver(broadcastReceiver); aufrufen kann. Ohne einen Handler kann ich das so nicht tun.

Ich muss dringends darauf achten keinen Speicherfresser zu schaffen.

Vielen Dank für eure Hilfe!!!!


----------



## RelaX (22. Jan 2015)

Hat sich hiermit erledigt. Alles klar soweit.


----------



## dzim (24. Jan 2015)

(Am besten vielleicht auch für die Nachwelt deine Erkenntnisse festhalten, es soll Leute geben, die sie Suchen-Funktion des Forums nutzen... Ab und an mal...)


----------



## RelaX (25. Jan 2015)

> Ich hab eben das Problem das ich manchmal einfach einen BroadcastReceiver brauche der genau ein Broadcast entgegennehmen kann und danach nicht mehr benötigt wird. Wenn ich einen Handler, wie beim ersten BroadcastReceiver, erstelle dann hab ich den Vorteil das ich noch in der run()-methode ein lbm.unregisterBroadcastReceiver(broadcastReceiver); aufrufen kann. Ohne einen Handler kann ich das so nicht tun.



Damit lag ich soweit richtig. Hinzu kommt das Android nach erfolgreichem onReceive() den BroadcastReceiver zur Löschung freigegeben hat, hab ich allerdings bisher noch nicht feststellen können! Vorteil des Handlers ist ja eben das dieser auch direkt die GUI ändern kann, weshalb hier Vorsicht angebracht ist, also bitte keine langen Berechnungen oder Sonstiges.


----------

