0

Ich versuche meine Android-App zu optimieren und habe beschlossen, alle meine Empfänger, die ich in der onStart-Methode registrieren, an einen Thread zu senden, der stattdessen innerhalb der onStart-Methode gestartet wird. Hier ist der Code:Android: Ich registriere meine Empfänger dynamisch in einem Nicht-UI-Thread

@Override 
public void onStart() { 
    Timber.e("onStart"); 
    super.onStart(); 
    Thread thread = new Thread() { 
     @Override 
     public void run() { 
      super.run(); 
      LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(locationReceiver, 
        new IntentFilter(Constants.MAIN_ACTIVITY_LOCATION)); 
     } 
    }; 
    thread.start(); 
} 

Kann ich meine Empfänger auf diese Weise registrieren?

Bisher scheint es zu funktionieren, aber ich bin unsicher, ob das nur Glück war oder ob das garantiert immer funktionieren wird.

+2

Sind Sie sicher, dass Sie diese "Optimierung" tun müssen? Sehen Sie Leistungseinbußen durch die Registrierung des Empfängers? –

+0

Ich schaute auf Traceview und sah eine ziemlich geringe Ladezeit, wenn ich alles auf einen Thread pushte. Ich werde es jetzt überprüfen. – Simon

+0

Wie erwähnt, könnte dies eine schlechte Idee sein, da Sie mit einem neuen Thread erstellt werden, würde ich sein. – Shaishav

Antwort

0

Das ist absolut in Ordnung zu tun:

public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 
synchronized (mReceivers) { 
    ReceiverRecord entry = new ReceiverRecord(filter, receiver); 
... 

Der LocalBroadcastManager.registerReceiver() ist Thread-sicher und die LocalBroadcastManager liefert immer Meldung auf dem UI-Thread (wie jeder Funkempfänger der Fall ist). Das einzige, was zu beachten ist, ist die Verwaltung der Registrierung von Zuhörern.

+0

Das Synchronisieren auf 'mReceivers' ist möglicherweise nur ein Implementierungsdetail, das die gleichzeitige Änderung einiger anderer Sammlungen verhindern soll. Es könnte andere Wege geben, dies zu erreichen, wenn die Dokumentation nicht besagt, dass 'registerReceiver' Thread-sicher ist, würde ich vorsichtig sein, von diesem Verhalten abhängig zu sein. –

+0

@KevinKrumwiede, während Sie einen Punkt über die Dokumente haben, ist Google nicht perfekt und der LocalBroadcastManager-Code ist sehr alt und hat sich im Laufe der Zeit nicht viel verändert. Wenn Sie sich wirklich Sorgen machen, können Sie den Code intern mitbringen, da er sehr klein und sehr einfach ist. – dhaag23