Как поместить логику с Eventbus в ведущий для Kotlin - PullRequest
1 голос
/ 11 июля 2019

Пожалуйста, если вы хотите посвятить вопрос, напишите причину улучшения.

Проблема в том, что я не знаю, как реализовать EventBus в Presenter с Kotlin. Это прекрасно работает, если я внедряю и подписываюсь в классе деятельности, но когда я пытаюсь использовать тот же код в докладчике, я получаю исключение. Может быть что-то в Kotlin способ реализации. В настройке eventbus не должно быть ничего плохого, потому что рассматриваемая реализация работает нормально

Моя деятельность => конструктор ведущего

    private val mMainPresenter = MainPresenter(this, MainInteractor(), this)

Мой ведущий

class MainPresenter(var mMainView: MainInterface?, val mMainInteractor: MainInteractor, val mContext : Context){

/**
 * Checking if user have language otherwise show list of games
 */
 fun checkingLanguage() {
    if(mMainInteractor.getUserLanguage() == "") mMainView?.callLanguageDialog()
    else EventBus.getDefault().post(LanguageEvent (mMainInteractor.getUserLanguage()))
}

fun registerSubscribers() {
    if (!EventBus.getDefault().isRegistered(mContext)) {
        EventBus.getDefault().register(mContext)
    }
}

@Subscribe
fun inflateGamesList(event: LanguageEvent){
    mMainView?.showGamesList(event.language)
} }

Код исключения

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.a3802256.zzzz, PID: 13508
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.a3802256.zzzz/com.example.a3802256.zzzz.view.main.MainActivity}: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.a3802256.zzzz.view.main.MainActivity and its super classes have no public methods with the @Subscribe annotation
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                  at android.app.ActivityThread.-wrap12(ActivityThread.java)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6119)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
               Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.a3802256.zzzz.view.main.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:140)
                  at com.example.a3802256.zzzz.view.main.MainPresenter.registerSubscribers(MainPresenter.kt:20)
                  at com.example.a3802256.zzzz.view.main.MainActivity.onCreate(MainActivity.kt:32)
                  at android.app.Activity.performCreate(Activity.java:6679)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                  at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:154) 
                  at android.app.ActivityThread.main(ActivityThread.java:6119) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

1 Ответ

2 голосов
/ 11 июля 2019

Если вы хотите слушать события в Presenter , вы должны зарегистрировать Presenter , а не активность (контекст).Итак,

fun registerSubscribers() {
    if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().register(this)
    }
}
...