【EventBus】より高性能なBroadcast代替

2307 ワード

今日、Bluetooth通信のアプリを書くには、10 ms間隔でデータを受信し続ける必要があります.受信側はもちろんサービスにありますが、データはメインactivityで処理し、UI表示するので、サービスのBluetooth通信サブスレッドでactivityにデータを送信します.それからその前にEventBusを使ってサービスとactivityの通信をしましたが、初心者だけが新しいものを試したいと思っていました.次に奇妙なことが起こりました.EventBusは確かにBroadcastほど使いやすいわけではありませんので、私はわけがわからずBroadcastに置き換えて、activity受信に遅延がありました.しかも明らかな遅延で、10数秒のものです.長い間調べていたが、同僚の指導の下でBroadcastによる遅延であることが分かった.本人菜鳥は1羽、なぜか分からないが、おそらくBroadcastの性能の問題であることしか知らないし、EventBusを変えてから確かに遅延現象がなくなったので、本編ではこの穴を記録しよう.
次はEventBusの使い方です.
公式GitHubアドレス:https://github.com/greenrobot/EventBus
 
最初にライブラリ依存を追加する:implementation'org.greenrobot:eventbus:3.1.1'
2番目のステップはメッセージを送ることです.とても簡単です.一言:EventBus.getDefault().post(new MessageEvent());
MessageEvent()は自分で1つ書けばいいので、次の例を示します.
private class MessageEvent{
	    public int type;
	    public int[] msg;
	    
	    public MessageEvent(int type,int[] msg){
	        this.type = type;
	        this.msg = msg;
        }
        
        public int getType(){
	        return type;
        }
        
        public int[] getMsg(){
	        return msg;
        }
    }

 
ステップ3メッセージを受信するには、まず登録する必要があります:EventBus.getDefault().register(this); 登録も忘れないでgetDefault().unregister(this); どこで受け取るかはそこに登録され、複数の受信者を登録することができます.
登録した後、メッセージを受信しなければなりません.そうしないと、プログラムがクラッシュします.
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
	    switch (event.type){
            case 0:
                int[] msg1 = event.msg;
                //do something
                break;
            case 1:
                int[] msg2 = event.msg;
                //do something
                break;
        }
    };

threadModeはメッセージを受信するスレッドモードで、4つのモードが選択できます.
他の人のブログのスレッドパターンの説明を抜粋します.
  • POSTING(デフォルト)は、イベント処理関数のスレッドとイベントを発行するスレッドが同じスレッドであることを示します.
  • MAINは、イベント処理関数のスレッドがメインスレッド(UI)のスレッドであることを示すため、ここでは時間のかかる操作はできない.
  • BACKGROUNDは、イベント処理関数のスレッドがバックグラウンドスレッドにあることを示すため、UI操作ができない.イベントをパブリッシュするスレッドがプライマリ・スレッド(UIスレッド)である場合、イベント処理関数はバックグラウンド・スレッドを開き、イベントをパブリッシュするスレッドがバックグラウンド・スレッドである場合、イベント処理関数はそのスレッドを使用します.
  • ASYNCは、イベントが発行されたスレッドがどれであるかにかかわらず、イベント処理関数は常に新しいサブスレッドで実行され、UI操作はできません.

  •  
    EventBusを使っているときは確かに使いやすさが足りず穴が多い気がしますが、本人が初心者なので、私が使えないのかもしれません.