0

내 안드로이드 앱을 최적화하려고하는데 onStart 메서드에 등록한 모든 수신기를 onStart 메서드 내에서 시작되는 스레드로 대신 전송하기로 결정했습니다. 코드는 다음과 같습니다.Android : 동적으로 비 사용자 인터페이스 스레드에서 수신기 등록

@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(); 
} 

수신자를 이렇게 등록 할 수 있습니까?

지금까지는 제대로 작동하는 것으로 보였지만 운이 좋았던 지 또는 항상 작동하는 지 확실하지 않은지 확실하지 않습니다.

+2

"최적화"를 수행 하시겠습니까? 수신기 등록으로 인한 성능 영향이 있습니까? –

+0

Traceview에서 보았을 때 모든 스레드를 푸시하면 로딩 시간이 상당히 감소했습니다. 나는 그것을 지금 두 번 점검 할 것이다. – Simon

+0

언급 한 바와 같이, 이것은 나쁜 생각으로 드러날 수 있습니다. 시스템에 새로운 스레드를 생성하는 부담이 있기 때문입니다. – Shaishav

답변

0

이 할 절대적으로 괜찮 :

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

LocalBroadcastManager.registerReceiver()는 스레드로부터 안전하고 LocalBroadcastManager 항상 (모든 방송 수신기처럼) UI 스레드에서 메시지를 배달합니다. 조심해야 할 유일한 것은 청취자를 등록 해제하는 것입니다.

+0

'mReceivers'에서 동기화하는 것은 다른 컬렉션의 동시 수정을 방지하기위한 구현 세부 사항 일 수 있습니다. 이를 달성 할 수있는 다른 방법이있을 수 있으므로, 문서에서'registerReceiver'가 쓰레드에 안전하다고하지 않는다면, 나는이 행동에 의존 할 것입니다. –

+0

@KevinKrumwiede, 문서에 대한 요지가 있지만 Google은 완벽하지 않으며 LocalBroadcastManager 코드는 매우 오래되었으며 시간이 지나도 많이 변경되지 않았습니다. 정말 걱정이된다면 코드를 사내에서 가져올 수 있습니다. 코드는 매우 작고 간단합니다. – dhaag23