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