Search code examples
androiddagger-2otto

OTTO + Dagger - Can't get event message on Application class


I'm learning to use otto as an event system. I can register my activity and receive the message from bus.post(). However, if I register my Application class, the subscribed method doesn't get called. What I'm I doing wrong?

This is my activity:

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);
}
}

App class

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;
}
}

My NetModule (partially)

@Module
public class NetModule {

    public NetModule() {

    }

    @Provides
    @NetScope
    BusWorker provideBusWorker(){

        return new BusWorker();
    }
}

NetScope

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

}

My NetComponent

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

    NetWorker netWorker();
    DbWorker dbWorker();
    LogWorker logWorker();
    SharedPreferencesWorker sharedPreferences();
    BusWorker BusWorker();
}

Solution

  • I modified the components, modules and the way they're being initialized in the Application class. This is the working code where the right message is received in the Application, Activity and fragment:

    SchoolComponent

    @SchoolScope
    @Component(modules={SchoolModule.class})
    public interface SchoolComponent {
    
        void inject(MainActivity activity);
    
        void inject(FragmentTest fragment);
    
        void inject(App app);
    
        School provideSchool();
    }
    

    NetComponent

    @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();
    }
    

    NetModule

    @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();
        }
    }
    

    Application class

    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;
        }
    }
    

    MainActivity

    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);
        }
    }