イベントコールバックと通知方式のまとめ(EventBusフレームワークの使用)


基本的な紹介と使用方法:
http://www.jianshu.com/p/a040955194fc
https://juejin.im/entry/570ae5668ac247004c3128a4
使用するシナリオ:
通常、userが終了したりログインしたりしたときに、各インタフェースにリフレッシュを通知します.あるいはデータが完了した後に通知する
入力されたオブジェクトに基づいてコールバックされるので、Stringタイプ判定文字列のタグ値を選択してインタフェースをリフレッシュできます!
従来のイベント通知方法:
1.Activityとサブfragmentの間(adapterとActivityの間など)は、コールバック関数を定義することによって対話できる
1.カスタムコールバックAクラスでインタフェースとインタフェースメソッドを定義し、コールバックが必要な場所でこのメソッドを使用します.
public class A_Fragment extends BaseFragment {
    private onSwitchpaperListener onSwitchpaperListener;

    //         
    public interface onSwitchpaperListener{
       void  switchpaper(int i);
    }


     //             。
    public void setOnSwichtpaerListener(onSwitchpaperListener listener){
        this.onSwitchpaperListener=listener;
    }
 
    @Override
    public void intiEvent() {
               
                if(onSwitchpaperListener!=null){
                     onSwitchpaperListener.switchpaper(position);
                 }else {

                 }
    }

}

B fragmentで具体的な操作ロジックを実装し、Aに必要なパラメータを入力します.
   mainActivity.getAFragment().setOnSwichtpaerListener(new Slidingleft_Fragment.onSwitchpaperListener() {
            @Override
            public void switchpaper(int i) {
                BaseCenterPaper currentPaper= baseCenterPaperList.get(i);
                tv_title.setText(lists.get(i).getTitle());
                //   
                fl.removeAllViews();
                currentPaper.initData();
                fl.addView(currentPaper.getRoot());
            }
        });

2.Activity StartActivity ForResult間のコールバック通知.
主に2つのパラメータresultcode  requedecode
要求コードは、そのActivityから発行されたresultcodeがどのActivityから返されたかを判断するために使用される
これでonActivity Resultメソッドでは正しく判断できます
  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == Contants.REQUEST_CODE && resultCode == this.RESULT_OK) {

            Log.d("   mainActivity    ","ture");

            new Thread() {
                public void run() {
                    //       ,      UI;
                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                            //   view g

                            if (user != null) {
                                //  mine
                                refrushMineView();
                                //     
                                refrushShopCarView();
                            }
                            else {
                            }
                        }

                    });
                }
            }.start();

        }
        if (requestCode == 2 && resultCode == 2) {

            Log.d("       ","ture");

            new Thread() {
                public void run() {
                    //       ,      UI;
                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                            //   view g
                            if(user!=null)
                            {
                                 refrushShopCarView();
                            }
                            else {
                            }
                        }

                    });
                }
            }.start();

        }

         if (user != null) {
            //     Activity
            if (MyApplication.getInstance(this).getIntent() == null) {

            }
            else {
                MyApplication.getInstance(this).jumpToTargetActivity(this);
            }
        }
        else {

        }


    }

注意事項!
onBack()リターンメソッド!super.onBackの前にsetResultを設定しないと無効になり、得られた値は常に0になります.
3.EventBusの使い方
1.列挙の代わりに注釈を用いていくつかの選択可能なイベントタイプを提供するイベントベースクラスを定義する
public class CTEvent {

    /**
     *     
     */
    @IntDef({TYPE_LOGIN, TYPE_CHECK_EMAIL})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Type {
    }

    /**
     *     
     */
    public static final int TYPE_LOGIN = 0;
    /**
     *     
     */
    public static final int TYPE_CHECK_EMAIL = 1;

    public @Type int type;

    public CTEvent(@Type int type) {
        this.type = type;
    }

}

2.イベントタイプのカプセル化、列挙の代わりに注釈でイベント発生時の必要パラメータを定義する
    /**
     *   
     */
    @IntDef({REASON_NONE, REASON_INVALID_PARAM})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Reason {
    }

    /**
     *    
     */
    public static final int REASON_NONE = 0;
    /**
     *      
     */
    public static final int REASON_INVALID_PARAM = 1;

    public boolean result;
    public  @Reason int reason;

    public CTLoginEvent(@Type int type, boolean result, @Reason int reason) {
        super(type);
        this.result = result;
        this.reason = reason;
    }

3.イベント発生
              EventBus.getDefault().post(new CTCheckEmailEvent(CTEvent.TYPE_CHECK_EMAIL, false, null));

4.イベントは受け入れられます.ここでは、戻りオブジェクトの論理を分散ではなくonEventで集中的に処理できることに注意してください.
@Subscribe
public void onEvent(CTEvent event) {
    switch (event.type) {
        case CTEvent.TYPE_CHECK_EMAIL:
            dealCheckEmailEvent((CTCheckEmailEvent) event);
            break;
        default:
            break;
    }
}



5.注意:
登録解除
EventBus.getDefault().unregister(this);
また、1つのクラスでは複数回の登録ができないため、1回のイベントが実行され、2回の論理に応答し、最大の可能性は2つの同じオブジェクトが生成されることである.