# BroadcastReceiver - Asynchron



## RelaX (22. Jan 2015)

Guten Tag,

Ich hab hier ein kleines Problem bzw eine Verständnisfrage was broadcastReceiver angeht. Folgendes möchte ich bewerkstelligen.

Es werden Intents gesendet die es gilt abzufangen. Diese Intents kommen asynchron an, da Sie von einem anderen Thread aus versendet werden.

Folgendes soll das vorgehen verdeutlichen:

Activity A senden Broadcast-Intent mit dem Ziel an Thread B ---> Thread B nimmt Broadcast-Intent und sendet anfrage an Server und wartet auf die Antwort ---> Thread B nimmt die Antwort vom Server und sendet einen Broadcast-Intent mit dem Ziel von Activity A ---> Activity A nimmt Broadcast-Intent entgegen udn verarbeitet diesen.


Hier die 2 wichtigen Methoden der Klassen. Ich habe jetzt mal das senden und empfangen vom Server weggelassen und das ganze mit einem Thread.Sleep versehen, als Verzögerung.

Hier der BroadcastReceiver in der Activity A

```
private void registerBroadCast() {
		IntentFilter inFi = new IntentFilter();
		inFi.addAction("de.dmg.COUNTRESULT");
		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("de.dong.COUNTRESULT")) {
							int newCounter = intent.getExtras().getInt("newCounter");
                                                        setNewCounterOnTextView(newCounter);
						}
				    }
				});				
			}
		};
		lbm.registerReceiver(broadcastReceiver,inFi);
	}
```
 

Und hier ist die Thread B welcher eigentlich Antworten vom Server versenden soll. Hier und realisiert mit Thread.Sleep um das zu simulieren:


```
@Override
	public void run() {
		counter = 0;
		while(counter < 25) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			counter++;
			sendNewCounter(counter);
		}
	}
	
	private void sendNewCounter(int newCounter) {
		Bundle data = new Bundle();
		data.putInt("newCounter", newCounter);
		Intent in = new Intent("de.dong.COUNTRESULT");
		in.putExtras(data);
		LocalBroadcastManager.getInstance(context).sendBroadcast(in);
	}
```


Jetzt hab ich das Problem das nach dem Orientation-Change die Methode welche für die Änderung in Activity A sorgt keinen Effekt mehr hat. Der BroadcastReceiver arbeitet aber sonst noch richtig bzw erkennt den Intent und nimmt in auch an.

Ich habe nun folgende Lösungsansätze, welche mir jetzt nicht so 100% gefallen.

1.)
In der onStop() der Activity löse ich den BroadcastReceiver mit unregister() und binde einen neuen BroadcastReceiver in der onStart(). Das hat zur folge das ich dann Antworten vom Server verliere und ich meine Anfrage erneut senden muss. Eine Anfrage ---> eine Antwort vom Server.

2.)
Nachdem Activity A ein Intent verschickt hat, sperre ich das Orientation-Change so lange bis die Antwort vom Server kommt.

3.)(nicht sicher)
Ein Service welcher die Aufgabe für mich übernimmt. Das heißt ich starte einen Service welcher die Anfrage sendet und entgegennimmt. Problem ist hierbei das ich ja mindestens eine Activity gebunden haben muss, dann hab ich doch wieder das selbe Problem. Bei einem gestarteten Service hab ich jetzt das Problem das ich nicht 100% weiß ob die Activity wieder kommt oder? Nachher hab ich das Problem das der Service einfach weiter läuft obwohl die Activity schon nicht mehr existiert.



Hoffe jemand kann mir seine Empfehlung geben wie man solch ein Szenario am besten bearbeitet.

Vielen Dank im Voraus!!!


----------



## RelaX (22. Jan 2015)

Also Möglichkeit 2.) Fällt weg da ja der Homebutton bedrückt werden kann. Passiert dies so funktioniert das ganze trotzdem allerdings hab ich da das Problem dass Android ja dann aus Speichermangel doch meine Activity zerstört. Ist der Result dann nicht eingetroffen, lande ich wieder beim Problem. Hier würde Möglichkeit 1.) dann weiter helfen.

Vielleicht sollte ich noch erwähnen, dass es sich bei den Anfragen nur um einfach Datensätze handelt die über eine aktive Socketverbindung angefragt werden. Das ganze geschieht also doch recht schnell. Bei einem Bilderupload würde ich ein AsyncTask bemühen welcher dann eine separate Verbindung aufbauen kann.


Möglichkeit 1.) hat allerdings einen bitteren Nachgeschmack bzw einige Nachteile:

Nachteil liegt auf der Hand: Man sendet Anfragen doppelt, dass heißt man hat unnötigen? content auf der Leitung und am Server.
Nachgeschmack: Der Server muss dahingehend abgestimmt werden mit doppelten Anfragen klar zu kommen. Beim Insert eines Objectes, welche in die Datenbank eingepflegt wird würde das ansonsten bedeuten das der exakt gleiche Datensatz zwei mal vorhanden wäre. Um das ganze zu synchronisieren könnte man einen boolean Wert zur Anfrage an den Server speichern womit man dann erkennen kann ob die Anfrage das zweite mal verschickt wurde und Serverseitig entsprechend reagieren. So könnte man dann überprüfen, ob ein bestimmtes Object bereits genau so in der Datenbank existiert.


Ich hoffe jemand kann sich dazu äußern da mich das ganze wirklich sehr interessiert!!


----------

