vendredi 9 janvier 2015

Lebensdauer BroadcastReceiver/Handler

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.




Java Code:






  1. private void registerBroadCast() {



  2. IntentFilter inFi = new IntentFilter();



  3. inFi.addAction("RESULT");



  4. LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getApplicationContext());



  5. broadCastReceiver = new BroadcastReceiver()



  6. {



  7. @Override



  8. public void onReceive(final Context context, final Intent intent) {



  9. new Handler().post(new Runnable () {



  10. public void run() {



  11. if(intent.getAction().equals("RESULT")) {



  12. @SuppressWarnings("unchecked")



  13. Object inputs = (Object ) intent.getExtras().get("inputs");



  14. readInputs(inputs);



  15. }



  16. }



  17. });



  18. }



  19. };



  20. lbm.registerReceiver(broadCastReceiver,inFi);



  21. }









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:




Java Code:






  1. final BroadcastReceiver broadCastReceiver = new BroadcastReceiver()



  2. {



  3. @Override



  4. public void onReceive(final Context context, final Intent intent) {



  5. Object inputs = (Object ) intent.getExtras().get("inputs");



  6. readInputs(inputs);



  7. }



  8. };



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





Lebensdauer BroadcastReceiver/Handler

0 commentaires:

Enregistrer un commentaire