0

私はAndroidアプリを最適化しようとしており、onStartメソッドで登録したすべての受信者をonStartメソッド内で開始されたスレッドに転送することに決めました。コードは次のとおりです。Android:非UIスレッドで受信者を動的に登録する

@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

関連する問題