2016-03-07 3 views
0

Я изучаю использование otto как систему событий. Я могу зарегистрировать свою деятельность и получить сообщение от bus.post(). Однако, если я зарегистрирую свой Application class, подписанный метод не будет вызван. Что я делаю неправильно?OTTO + Кинжал - Не удается получить сообщение о событии по классу приложения

Это моя активность:

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 класс

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

Мои NetModule (частично)

@Module 
public class NetModule { 

    public NetModule() { 

    } 

    @Provides 
    @NetScope 
    BusWorker provideBusWorker(){ 

     return new BusWorker(); 
    } 
} 

NetScope

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

Является ли ваш автобус '@ Singleton' аннотированный или иначе область видимости? Я предполагаю, что вы подписываетесь на два разных объекта шины в активности/приложении. –

+0

Я только что отредактировал исходное сообщение, добавив свой netModule, Scope и компонент. Я что-то упускаю, чтобы убедиться, что я зарегистрируюсь на одном автобусе? – Ricardo

+1

Выглядит хорошо, вы все равно можете просто проверить его, зарегистрировав объекты и сравнив их. –

ответ

0

Я модифицировал компоненты, модули и способ, которым они инициализируются в классе Application. Это рабочий код, где получил право сообщения в заявке, активность и фрагмент:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^