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。这是比较这两个对象的正确方法吗?您没有说明如何创建
学校组件或它是什么,但它表明您有两个不同的对象,因此您可能正在创建另一个网络组件
供学校组件
使用吗?