EventBusの最適化-KeventBus


一、前言
eventbus3.0のメリットとデメリットの分析:
eventbusは観察者モードに基づいて、少ないコードで、多くの機能を実現して、私たちのコードを優雅にします.しかし、eventbusを大面積で使用すると、深刻な問題が発見されます.
  • は、サブスクリプション方法を区別するために多くのクラスを作成する必要があります.サブスクリプション方法が多ければ多いほど、クラスが多くなり、コードが多ければ多いほど、apkの体積が大きくなります.
  • はクラスでこのイベント伝達を貫く方式で、ブロードキャスト方式で問題を送信した後、イベントソースやサブスクリプション方法を調べるのは比較的難しい
  • である.
  • は多くの購読方法を書く必要があり、購読方法は空を飛び、dex方法数が
  • を超えやすい.
  • 送信ブロードキャストは、戻り値
  • を受信できない.
  • privateの購読方法が分からずeventbusがなぜこのように設計したのか分からない
  • データを送信する必要はないのに、通知だけでクラス
  • を渡す必要がある.
  • 単独のサブスクリプションをキャンセルできない方法
  • この上のいくつかの問題をめぐってeventbusに基づいて改善しました.
    二、改善説明:android eventbus 3.0バージョンに基づく最適化:
  • 最適化前期はクラスを区分して傍受受信対象とし、多くのクラスを作成する必要があり、最適化後は文字列方式をイベントevent-key区分としてクラスの代わりに採用し、多すぎるクラスの作成を避け、コード量を減らし、比較的優雅であることを考慮し、本思想もios通知の実現を参考にする.
  • は戻り値をサポートし、privateとstaticをサポートする方法
  • をサポートする.
  • 最適化前、購読者は多くの傍受方法を購読して分類を区別する必要があり、最適化後、傍受方法を減らすことができ、1つの方法または複数の方法の中で分類判断を行うことができ、handler
  • から思想が来ている.
  • 最適化前のメンテナンスが難しく、イベントの発生源が不明であることを示し、最適化後、イベントvent keyを統一的に管理することができ、管理がbug
  • を検索するのに便利である.
  • は、イベントのみを送信する機能
  • をサポートする.
  • は、冷凍イベント方法と、冷凍イベントを解除する方法
  • とをサポートする.
    他の態様、例えばSubscribeの購読方法、スレッドモード、粘性イベント等の処理はeventbus 3である.0の処理は一致しています.
    プロジェクト使用:androidstudio gradle導入:implementation'com.github.chenjk-520:keventbus:1.1’プロジェクトオープンソースアドレス:githubアドレス、使いやすいと思ったらスターかボーナスをあげましょう.改善すべき点があれば、以下のコメントや私信を私のメールに送ってください[email protected]
    三、使用説明
    とeventbus 3.0バージョンの使用方法は多くなくeventbus 3です.0改善、次に使用方法を見てみましょう
  • 使用を理解する前に、重要なクラスEventMessage
  • の1つを理解してください.
         private T msg;
         private String event;
         private int arg;
         private CallBack callBack;
    

    msgは私たちが送信する必要があるデータであり、任意のデータeventが私たちのイベントに対応するeventであり、このeventを通じてサブスクリプションの方法を見つけることができます.Argは、eventの一次分類callBackでブロードキャスト送信後のコールバックを処理します.
    1.登録イベントと登録解除イベント
        :
    
      KeventBus.getDefault().register(this);
    
          :
     
      KeventBus.getDefault().unregister(this);
    

    2.event-keyのみを使用し、データを送信しない
    送信イベント:
     KeventBus.getDefault().post(TestKey.SAY_HELLO);
    

    受信イベント:
    @Subscribe(event = TestKey.SAY_HELLO,threadMode = ThreadMode.MAIN)
    public void hello(EventMessage msg){
        Log.i("TAG",msg.getEvent());
    }
      post  TestKey.SAY_HELLO, @Subscribe event = TestKey.SAY_HELLO          
    

    3.event-keyを使用してデータを送信
    送信イベント:
     KeventBus.getDefault().post(new EventMessage<>("say hello!",TestKey.SAY_HELLO));
    

    ここでの構造関数パラメータはそれぞれmsg,eventである.
    受信データ:
      @Subscribe(event = TestKey.SAY_HELLO,threadMode = ThreadMode.MAIN)
      public void hello(EventMessage msg){
          Log.i("TAG",msg.getMsg());
      }
    

    4.event-keyを使用し、データを送信し、同じサブスクリプション方法で区別する.handlerのmessageに似ている.eventはwhat属性に相当し、argもmessageのargと同じである.
    送信イベント1:
         KeventBus.getDefault().post(new EventMessage("data==1",TestKey.SAY_HELLO,1));
    

    送信イベント2:
         KeventBus.getDefault().post(new EventMessage("data==2",TestKey.SAY_HELLO,2));
    

    ここでの構造関数パラメータはそれぞれmsg,event,argである.
    受信イベント:
          @Subscribe(event = TestKey.SAY_HELLO,threadMode = ThreadMode.MAIN)
          public void hello34(EventMessage msg){
            if (msg.getArg() == 1){
                Toast.makeText(this,msg.getMsg(),Toast.LENGTH_SHORT).show();
            }else if(msg.getArg() == 2 ){
                Toast.makeText(this,msg.getMsg(),Toast.LENGTH_SHORT).show();
            }
         }
    

    5.サブスクリプションメッセージの送信後のコールバックをサポート
    購読メッセージの送信:
            KeventBus.getDefault().post(new EventMessage("  data",TestKey.SAY_HELLO, new EventMessage.CallBack() {
                            @Override
                            public void onCall(String result, int arg) {
                                //         
                                Log.i("TAG",result);
                            }
                        }));
    

    受信イベント:
            @Subscribe(event = TestKey.SAY_HELLO4,threadMode = ThreadMode.ASYNC,enback = true)
            private String hello5(EventMessage msg){
                Log.i("TAG",msg.getMsg());
                return "     ";
            }                       
    

    注意:1.受信イベントにenback=true 2を付ける必要がある.ここでのコールバックの後はイベントを受信するスレッドですが、メインスレッドの中で発せられてサブスレッドで受信して返されるイベントであれば、コールバックの方法は受信方法のスレッドですが、toastが必要な場合は、自分でメインスレッドに切り替えて処理する必要があります
    5.冷凍イベントとアクティブイベントのサポート
    説明:イベントを冷凍した後、対応するイベントを送信すると、サブスクリプションの方法はこの時間を受信できませんが、このサブスクリプションの方法は本当に削除されていません.この方法を再アクティブにすることで、次回の送信で再受信できます.
    冷凍方法:
          KeventBus.getDefault().freezeSubscribeEvent(TestKey.SAY_HELLO);
    

    アクティブ化方法:
         KeventBus.getDefault().activeEvent(TestKey.SAY_HELLO);