私は、スクエアがAndroidコミュニティに対して行ったオープンソースの貢献の大ファンであり、彼らの最新の貢献Otto(イベントバス)を調査していました。
Ottoはリフレクションを使用しており、順序付けされたブロードキャスト(同じタイプのイベントをリッスンしている1つのレシーバーから次のレシーバーに未使用のメッセージが渡されるパターン)がないことをさらに深く掘り下げています。
Androidには、v4サポートライブラリに同じ目的を果たすLocalBroadcastManager
(LBM)がありますが、より大きく、渡されるオブジェクトに対する制限が多くなります。ただし、明るい面は、順序付けされたブロードキャストをサポートし、通常のブロードキャストに似ています。
OttoとLBMはどちらも同じプロセス空間内にあるので、速度の点ではどちらも同じだと思います。私が目にした唯一の真の違いは、Ottoではカスタムイベントを定義できるため、オブジェクトをシリアル化/パーセルする必要がないことです。
したがって、私の本当の質問は、LBMが同じことをする場合、いつOttoを使用するかです。
参照:
http://nick.perfectedz.com/otto-event-system/
同じアプリ内で通信するためにインテントまたはイベントバスを使用
https://plus.google.com/107049228697365395345/posts/6j4ANWngCUY
しかし、明るい面では、順序付けされたブロードキャストをサポートします
あんまり。 LocalBroadcastManager
にはsendOrderedBroadcast()
がなく、IntentFilter
の優先度は使用されていないようです。 「受信機を登録した順番で放送が配信される」というのであれば、それが現在の振る舞いかもしれませんが、そのまま続く保証はありません。
OttoとLBMの両方が同じプロセス空間内にあるので、速度の点では両方とも同じだと思います
それらはおそらく同じではありませんが、似ています。
したがって、私の本当の質問は、LBMが同じことを行う場合、いつOttoを使用しますか
これら2つを比較すると、OttoにはよりきれいなAPI、IMHOがあります。
個人的には、より柔軟なスレッドモデルを提供するため、これらのどちらに対しても greenrobotのEventBus を使用します。
OttoとLBMはどちらも同じプロセス空間内にあるので、速度の点ではどちらも同じだと思います。
Ottoイベントの登録は非常に高価であることがわかりました。イベントサブスクライバーの登録に16ミリ秒以上かかる場合があります(つまり、1 FPSを落とします!)。 Ottoでサブスクライブするイベントはリフレクションによって行われるため、これはある程度予想されます。 LBMの場合、登録には数百µsしかかかりません。これはほぼ32倍高速です。 (traceviewの結果、Samsung Galaxy S4)
しかし、もちろん、Ottoを使用するとコードを少なくすることができ、トレードオフがあります。