0

Setup Ich experimentiere EventBus Libaray. Ich habe es nur in Fragment registriert und ich verwendete @Subcride Annotation in dieses Fragment mit public Methoden, aber wenn ich die App ausführen, bekomme ich eine Ausnahme, die besagt, dass ich @Subcribe Annotation mit public Methoden in super Klasse nicht verwendet habe. Warum muss ich es in Klasse super deklarieren? Wie dieses Problem Dies ist mein erstes Mal mit EventBusWie EventBus in Fragment

Hier Code

Fragment

public class SignUpFragment extends BaseFragment { 
Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View layout = inflater.inflate(R.layout.fragment_sign_up, container, false); 
    ButterKnife.bind(this, layout); 
    return layout; 
} 

// TODO: Rename method, update argument and hook method into UI event 
public void onButtonPressed(String uri) { 
    if (mListener != null) { 
     mListener.onSignUpFragmentInteraction(uri); 
    } 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    EventBus.getDefault().register(getActivity()); // Here comes the exception 
    if (context instanceof OnSignUpFragmentInteractionListener) { 
     mListener = (OnSignUpFragmentInteractionListener) context; 
    } else { 
     throw new RuntimeException(context.toString() 
       + " must implement OnSignUpFragmentInteractionListener"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    EventBus.getDefault().unregister(getActivity()); 
    mListener = null; 
} 
@Subscribe(threadMode = ThreadMode.MAIN) 
public void onEvent(JSONObject response) { 

    Log.d(TAG, response.toString()); 

} 

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onEvent(VolleyError error) { 
    Log.d(TAG, error.toString()); 
} 
} 

Dies ist die Ausnahme, die ich

10-31 11:01:46.172 9047-9047/com.aam.skillschool E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.aam.skillschool, PID: 9047 
org.greenrobot.eventbus.EventBusException: Subscriber class com.aam.skillschool.ui.activities.MainActivity and its super classes have no public methods with the @Subscribe annotation 
at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:67) 
at org.greenrobot.eventbus.EventBus.register(EventBus.java:136) 
at com.aam.skillschool.ui.fragments.SignUpFragment.onAttach(SignUpFragment.java:113) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1048) 
at android.support.v4.app.BackStackRecord.setLastIn(BackStackRecord.java:838) 
at android.support.v4.app.BackStackRecord.calculateFragments(BackStackRecord.java:878) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:719) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541) 
at android.os.Handler.handleCallback(Handler.java:751) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Antwort

1

Sie passieren getActivity() zu EventBus register() Methode, nicht stattdessen das Fragment passieren, das sollte in diesem Fall seine this

0

Sie erhalten zu beheben sind wahrscheinlich EventBus.getDefault().register(this) in Ihrer Aktivität aufrufen, aber keine Methoden mit der @Subscribe haben Anmerkung.

Sie müssen nur die Komponenten registrieren, die die Anmerkungen verwenden.

Verschieben Sie die Registrierung zu Ihrem Fragment.

+0

Ich mache all dieses Zeug in Fragment, da ich all diese Funktionalität in Fragment –

+0

möchte Die Ausnahme besagt, dass Sie Ihre Aktivität sowie \ anstelle des Fragments registriert haben. Wenn Sie keine @Subscribe-Anmerkungen in der Aktivität haben, sollten Sie sie nicht beim Ereignis-Bus registrieren. – Kuffs

+0

Was ich gesagt habe, war korrekt, aber wenn Sie weiter nachsehen, verwenden Sie OnAttach in Ihrem Fragment, um die Aktivität zu registrieren. Bitte verwenden Sie OnPause/OnResume, um das Fragment zu registrieren und die Registrierung aufzuheben. – Kuffs

0

mit klebrigen Ereignissen Betrachten (registerSticky()), weil die Ereignisse auf diese Weise gesendet werden warten, bis Fragment erhalten Sie. Dies kann hilfreich sein, um den Lebenszyklus von Fragment zu überprüfen. - Aktivität senden Ereignis zu einem Zeitpunkt, wenn Fragment nicht bereit und Fragment wird es irgendwann erhalten - wenn es aufgeblasen und bereit. Zum Abonnieren einer Art von Ereignis erstellen Sie eine öffentliche Methode mit der @Subscribe-Annotation.