Android:Otto 事件总线实现

Android: Otto event bus implementation

我正在开发 Android 应在 RecyclerView 上使用分页的应用程序。我在 Service 中使用 Executor 向 API 发出网络请求,然后将获取的数据保存在数据库中。要通知数据库中的更改,然后在我的适配器中应用新数据,我建议使用 Otto 事件总线。 Publisher/subscriber 模式对我来说很新,所以我试图找到好的教程或解释它应该如何工作,但经过两天的搜索后,我对我应该实现什么以及事件总线实际如何工作只有模糊的想法。有人可以在教程或代码示例中给出我应该从哪里开始或 link 的好提示吗?我知道这是一个真正的新手问题,但目前我没有看到其他选择。

我找到的最佳指南是:来自 Vogella and from Codepath。我希望它能帮助别人。根据我的经验,好的注意事项 - Otto EventBus 工作同步,记住它。

将此库导入您的应用级等级:

implementation 'org.greenrobot:eventbus:3.0.0'

为事件处理创建一个 class:

public class DataSyncEvent {
    private final String syncStatusMessage;
    private final String countryName;
    private final int postion;

    public DataSyncEvent(String syncStatusMessage, int postion, String countryName) {
        this.syncStatusMessage = syncStatusMessage;
        this.postion = postion;
        this.countryName = countryName;
    }

    public String getSyncStatusMessage() {
        return syncStatusMessage;
    }

    public String countryName() {
        return countryName;
    }

    public int getPostion() {
        return postion;
    }
}

现在从您的 class/fragment 或服务传递值:

EventBus.getDefault().post(new DataSyncEvent(leftOrRight, position, countryName));

不要忘记在您使用@Subscribe

的地方注册和注销巴士
@Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }
    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    } 

使用@Subscribe 你可以获得这些值:

 @Subscribe
    public void onEvent(DataSyncEvent syncStatusMessage) {


        if (syncStatusMessage.getSyncStatusMessage().contains("left")) {

            leftPosition = syncStatusMessage.getPostion();
            img_flag_left.setImageResource(countriesFlag[leftPosition]);
            leftCountryName.setText(syncStatusMessage.countryName());

        } else {
            rightPosition = syncStatusMessage.getPostion();
            img_flag_right.setImageResource(countriesFlag[rightPosition]);
            rightCountryName.setText(syncStatusMessage.countryName());
        }


    }