Android 奥托+;匕首罐';无法在应用程序类上获取事件消息

Android 奥托+;匕首罐';无法在应用程序类上获取事件消息,android,dagger-2,otto,Android,Dagger 2,Otto,我正在学习使用奥托作为一个事件系统。我可以注册我的活动并从bus.post()接收消息。但是,如果注册我的应用程序类,则不会调用订阅的方法。我做错了什么 这是我的活动: public class MainActivity extends AppCompatActivity { @Inject BusWorker busWorker; @Inject LogWorker logWorker; ActivityMainBinding binding; @Override protected v

我正在学习使用奥托作为一个事件系统。我可以注册我的活动并从
bus.post()
接收消息。但是,如果注册我的
应用程序类
,则不会调用订阅的方法。我做错了什么

这是我的活动:

public class MainActivity extends AppCompatActivity {

@Inject
BusWorker busWorker;
@Inject
LogWorker logWorker;

ActivityMainBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    inject();

    ButterKnife.bind(this);
    busWorker.register(this);
    binding.setHandlers(this);
}

@Subscribe
public void recievedMessage(Message message) {
    logWorker.log("recievedMessage: " + message.getMessage());
}

public void onClickButton(View view) {

    switch (view.getId()) {
        case R.id.button:
            busWorker.post("Test message");
            break;
        default:
            break;
    }
}

@Override
protected void onStop() {
    super.onStop();
    busWorker.unRegister(this);
}

void inject() {
    ((App) getApplication()).getGeneralComponent().inject(this);
    ((App) getApplication()).getSchoolComponent().inject(this);
}
}
应用程序类

public class App extends Application {

private NetComponent netComponent;
private GeneralComponent generalComponent;

@Inject
public App() {}

@Override
public void onCreate() {
    super.onCreate();

    netComponent = DaggerNetComponent.builder()
            .appModule(new AppModule(this))
            .netModule(new NetModule())
            .build();

    generalComponent = DaggerGeneralComponent.builder()
            .netComponent(netComponent)
            .generalModule(new GeneralModule())
            .build();

    netComponent.BusWorker().register(this);
}

@Subscribe
public void recievedMessage(Message message) {
    netComponent.logWorker().log("recievedMessage: " + message.getMessage());
}

public GeneralComponent getGeneralComponent() {
    return generalComponent;
}

public NetComponent getNetComponent() {
    return netComponent;
}
}
我的网络模块(部分)

网镜

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface NetScope {

}
我的NetComponent

@NetScope
@Component(modules={AppModule.class, NetModule.class})
public interface NetComponent {

    NetWorker netWorker();
    DbWorker dbWorker();
    LogWorker logWorker();
    SharedPreferencesWorker sharedPreferences();
    BusWorker BusWorker();
}
@NetScope
@Component(modules={NetModule.class})
public interface NetComponent {

    void inject(MainActivity activity);

    void inject(FragmentTest fragment);

    void inject(App app);

    NetWorker provideNetWorker();
    DbWorker provideDbWorker();
    LogWorker provideLogWorker();
    SharedPreferencesWorker provideSharedPreferences();
}

我修改了组件、模块以及它们在应用程序类中初始化的方式。这是在应用程序、活动和片段中接收正确消息的工作代码:

学校组成部分

@SchoolScope
@Component(modules={SchoolModule.class})
public interface SchoolComponent {

    void inject(MainActivity activity);

    void inject(FragmentTest fragment);

    void inject(App app);

    School provideSchool();
}
网络组件

@NetScope
@Component(modules={AppModule.class, NetModule.class})
public interface NetComponent {

    NetWorker netWorker();
    DbWorker dbWorker();
    LogWorker logWorker();
    SharedPreferencesWorker sharedPreferences();
    BusWorker BusWorker();
}
@NetScope
@Component(modules={NetModule.class})
public interface NetComponent {

    void inject(MainActivity activity);

    void inject(FragmentTest fragment);

    void inject(App app);

    NetWorker provideNetWorker();
    DbWorker provideDbWorker();
    LogWorker provideLogWorker();
    SharedPreferencesWorker provideSharedPreferences();
}
网络模块

@Module
public class NetModule {

    @Provides
    @NetScope
    SharedPreferencesWorker provideSharedPreferences(){

        return new SharedPreferencesWorker();
    }

    @Provides
    @NetScope
    NetWorker provideNetWorker(){

        return new NetWorker();
    }

    @Provides
    @NetScope
    DbWorker provideDbWorker(){

        return new DbWorker();
    }

    @Provides
    @NetScope
    LogWorker provideLogWorker(){

        return new LogWorker();
    }

    @Provides
    @NetScope
    BusWorker provideBusWorker(){

        return new BusWorker();
    }
}
应用程序类

public class App extends Application {

    private NetComponent netComponent;

    private SchoolComponent schoolComponent;

    @Inject
    BusWorker busWorker;

    @Inject
    public App() {

    }

    @Override
    public void onCreate() {
        super.onCreate();

        schoolComponent = DaggerSchoolComponent.create();
        schoolComponent.inject(this);

        netComponent = DaggerNetComponent.create();
        netComponent.inject(this);

        busWorker.register(this);
    }

    @Subscribe
    public void recievedMessage(Message message) {

        Log.d("Dagger", "recievedMessage App: " + message.getMessage());
    }

    public SchoolComponent getSchoolComponent() {

        return schoolComponent;
    }

    public NetComponent getNetComponent() {

        return netComponent;
    }
}
主要活动

public class MainActivity extends AppCompatActivity {

    @Inject
    BusWorker busWorker;
    @Inject
    LogWorker logWorker;
    @Inject
    School school;

    @Bind(R.id.name)
    TextView name;

    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        ButterKnife.bind(this);

        inject();
    }

    @Override
    protected void onResume() {
        super.onResume();

        busWorker.register(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        busWorker.unRegister(this);
    }

    @Subscribe
    public void recievedMessage(Message message) {

        logWorker.log("recievedMessage Activity: " + message.getMessage());
    }

    public void onClickButton(View view) {

        switch (view.getId()) {

            case R.id.button:

                busWorker.post(new Message("blablabla"));

                break;

            default:

                break;
        }
    }

    void inject() {

        ((App) getApplication()).getNetComponent().inject(this);
        ((App) getApplication()).getSchoolComponent().inject(this);
    }
}

您的总线是注释的还是其他范围的?我的猜测是,您在活动/应用程序中订阅了两个不同的总线对象。我刚刚编辑了原始帖子,添加了我的netModule、Scope和component。我错过了一些东西来确保我注册到同一个总线?看起来没问题,您仍然可以通过记录对象并比较它们来快速检查它。我使用了busWorker.getBus().equals(FragmentTest.busWorker.getBus())并得到false。这是比较这两个对象的正确方法吗?您没有说明如何创建
学校组件或它是什么,但它表明您有两个不同的对象,因此您可能正在创建另一个
网络组件
学校组件
使用吗?