Android-无法在单独的模块中使用 org.greenrobot.eventbus

Posted

技术标签:

【中文标题】Android-无法在单独的模块中使用 org.greenrobot.eventbus【英文标题】:Android- Unable to use org.greenrobot.eventbus inside of separate module 【发布时间】:2021-11-20 06:28:28 【问题描述】:

在这里,我正在编写自定义日历组件模块库。我的最终目标是将所选日期的回调信息从日历可用的模块库传递给主项目。

我正在尝试在我的项目的单独模块中访问 org.greenrobot.eventbus。但是,低于错误。当我在 MainActivity 活动中声明 @Subscribe 方法时,这已解决。但是,我想从模块订阅,而不是从主项目订阅。需要您的帮助来解决此问题。

org.greenrobot.eventbus.EventBusException:订阅者类 com.sayantan.weekcalender.MainActivity 及其超类没有带有 @Subscribe 注释的公共方法

已编辑

apply plugin: 'com.android.library'

android 
    compileSdkVersion 31
    buildToolsVersion "30.0.3"

    defaultConfig 
        minSdkVersion 22
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    

    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        
    
    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    


dependencies 
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'joda-time:joda-time:2.10.10'
    implementation 'org.greenrobot:eventbus:3.2.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'

WeekCalender.java 放在模块文件中。

public class WeekCalender extends LinearLayout 
    /**
     * Reference variables
     **/
    private Context mContext;
    private OnDateClickListener mListener;
    private List<DateTime> mDateTimeList;

    public WeekCalender(Context context) 
        super(context);
        this.mContext = context;
        initDays();
        initViews(null);
    

    public WeekCalender(Context context, @Nullable AttributeSet attrs) 
        super(context, attrs);
        this.mContext = context;
        initDays();
        initViews(attrs);
    

    public WeekCalender(Context context, @Nullable AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        initDays();
        initViews(attrs);
    

    private void initViews(AttributeSet attrs) 
        if (attrs != null) 
            //.....
        

        NUM_OF_PAGES = calculateNoOfPage();
        WeekPager weekPager = new WeekPager(getContext(), attrs);
        addView(weekPager);
    

    private void initDays() 
        //....
        //....
    

    private int calculateNoOfPage() 
        int noOfPage = 0;
        //....
        //....
        return noOfPage;
    

    /**
    * This method is not getting triggered here, but, this is working find in main project activity class
    */
    @Subscribe
    public void onDateClicked(Event.CalenderEvent event) 
        Toast.makeText(mContext, event.getSelectedDate().toLocalDate().toString(), Toast.LENGTH_SHORT).show();
        if (mListener != null)
            mListener.onDateClick(event.getCurrentDate());
    

    @Override
    protected void onAttachedToWindow() 
        super.onAttachedToWindow();

        if (!EventBus.getDefault().isRegistered(mContext)) 
            EventBus.getDefault().register(mContext);
        
    

    @Override
    protected void onDetachedFromWindow() 
        super.onDetachedFromWindow();

        if (EventBus.getDefault().isRegistered(mContext)) 
            EventBus.getDefault().unregister(mContext);
        
    

    public void setSelectedDate(DateTime selectedDate) 
        EventBus.getDefault().post(new Event.SetSelectedDateEvent(selectedDate));
    

    public void setOnDateClickListener(OnDateClickListener listener) 
        this.mListener = listener;
    

请注意:从该模块内的 viewpager 片段发布的事件。

DaysAdapter-

// Event handler
            root.setOnClickListener(v -> 
                // change text color
                DateListUtils.setSelectedDate(item);
                EventBus.getDefault().post(new Event.CalenderEvent(dateTime, item));
                setColor(item);
            );

【问题讨论】:

您是否尝试将 EventBus 作为依赖项添加到您的模块中? @hardartcore 是的。已经在模块 build.gradle 中添加了这一行实现 'org.greenrobot:eventbus:3.2.0' 您需要向我们提供有关您的项目设置、模块和确切错误的更多说明。 @hardartcore 在这篇文章中添加了示例代码。请对此进行调查。 没有添加有用的示例代码。不要使用 Github gist,只需在此处粘贴您的代码。 【参考方案1】:

请替换以下代码。目前,您在 mContext 对象上注册并且它不包含任何订阅者,那么您需要传递事件 WeekCalendar 的实例。

@Override
protected void onDetachedFromWindow() 
    super.onDetachedFromWindow();

    if (EventBus.getDefault().isRegistered(this)) 
        EventBus.getDefault().unregister(this);
    



@Override
protected void onAttachedToWindow() 
    super.onAttachedToWindow();

    if (!EventBus.getDefault().isRegistered(this)) 
        EventBus.getDefault().register(this);
    

【讨论】:

以上是关于Android-无法在单独的模块中使用 org.greenrobot.eventbus的主要内容,如果未能解决你的问题,请参考以下文章

实现自己的HAL-7 Android 系统的各个模块的单独编译

Dagger 在单独的 gradle 模块中

Gradle for Android 第五篇( 多模块构建 )

无法在模块中使用 android-maps-utils

Android-Gradle

无法在 Android 库模块中启动 Activity