BroadcastReceiver - Asynchron

  • Antworten:0
Marco
  • Forum-Beiträge: 28

23.01.2015, 01:12:02 via Website

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!!!

Antworten