EventBus3.1.1 Caused by:orgを解決する.greenrobot.eventbus.EventBusException: Subscriber class ... and its ...

2224 ワード

おかずは今日自分でDemoをテストする時、EventBusを使う必要があります.現在3.1.1バージョンを統合しています.統合の方法は簡単です.あるFragmentの実践応用の中で、ずっと間違いを報告しています.Caused by:org.greenrobot.eventbus.EventBusException: Subscriber class com.roating.ace.frag.FragmentSign and its super classes have no public methods with the @Subscribe annotation
問題が発生したら解決しますか?
  • EventBus統合に混同ファイルが追加されているかどうかを確認する:
  • -keepattributes *Annotation*
    -keepclassmembers class ** {
        @org.greenrobot.eventbus.Subscribe ;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
    
    # Only required if you use AsyncExecutor
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        (java.lang.Throwable);
    }
    
  • FragmentでEventBusの登録が正しいかチェック:
  • @Override
    protected View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        EventBus.getDefault().register(this);
        View view = inflater.inflate(R.layout.activity_sign, null);
        return view;
    }
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        EventBus.getDefault().unregister(this);
    }
    
  • Eventを受ける方法に@Subscribeを追加するかどうかをチェック:
  • @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    void refreshSignTime(EventMessageK.SignStateME event) {
        if (event != null) {
            if (event.getType() == 1) {
                mUpTv.setText(event.getTime());
            } else {
                mDownTv.setText(event.getTime());
            }
        }
    }
    

    一見問題ないと思いますが、毎回its super classes have no public methods with the@Subscribe annotationを報告しています.気まずいですが、その後はネット上の大神を調べて説明しても、問題点に気づかず、以前書いたコードを見て、ふと悟りました.最近Kotlinを勉強しているので、方法定義を直接定義することができ、方法権限public/private/protectedなどを省略することがよくあります.Eventメッセージを受信するにはpublicが必要であることに気づき、簡単ななどの知識点が基礎がしっかりしていないために多くの時間を浪費しているので、おかずの問題に遭遇しないことを望んでいます.
    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    fun checkLoginInfo(event: MessageEvent.LoginInfoME) {
        loginPhone = event.phone
    }
    
    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void checkLoginInfo(MessageEvent.LoginInfoME event) {
        loginPhone = event.phone
    }
    
       , ~
    

    おかず公衆番号