Как быть неотъемлемым от нескольких действий с событиями жизненного цикла и поддержкой шины событий в Android Java?

#java #android #android-activity #interface #greenrobot-eventbus

#java #Android #android-активность #интерфейс #greenrobot-eventbus

Вопрос:

У меня есть два действия, которые оба затем расширяются из базового действия.

т.е.

 CarActivity{

}

GasCarActivity extends CarActivity{

  function onCreate(){
     registerGasEvent() // so that onLowGasEvent() will work
  }

  function checkGas(){}

  @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowGasEvent(){

  }
}

ElectricCarActivity extends CarActivity{

  function checkBattery(){}

  @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowBatteryEvent(){

  }
}
  

Теперь мне нужен HybridCarActivity, который использует функции GasCarActivity и ElectricCarActivity и события жизненного цикла.

Я также использую библиотеку eventbus, как я могу использовать функцию подписки как onLowGasEvent, так и onLowBatteryEvent в HybridCarActivity?

Что я могу здесь сделать?

Ответ №1:

Java не поддерживает множественное наследование реализации, но поддерживает множественное наследование интерфейса. Итак, вы можете реализовать столько интерфейсов, сколько захотите. Чтобы избежать дубликатов и совместно использовать код между несколькими классами, вы можете использовать делегаты.

Например:

  1. Интерфейсы:
 interface IGas {
  checkGas();
  onLowGasEvent();
}

interface IBattery
  checkBattery();
  onLowBatteryEvent();
}
  
  1. реализации общей функциональности
 class GasImpl implements IGas {
  checkGas() {
  ...
  }
  onLowGasEvent() {
  ...
  }
}

class BatteryImpl implements IBattery {
  checkBattery() {
  ...
  }
  onLowBatteryEvent() {
  ...
  }
}
  
  1. Действия (обратите внимание на набор реализаций):
 class GasCar extends Car implements IGas {
  IGas mGasImpl = new GasImpl();   // create it in your own code, or inject to inverse dependencies, etc.

  checkGas() {
    mGasImpl.checkGas();
  }

  onLowGasEvent() {
    mGasImpl.onLowGasEvent();
  }
}

class BatteryCar extends Car implements IBattery {
  IBattery mBatteryImpl;   

  checkBattery() {
    mBatteryImpl.checkGas();
  }

  onLowBatteryEvent() {
    mBatteryImpl.onLowBatteryEvent();
  }
}
  
  1. И тогда ваш HybridCar будет чем-то вроде этого:
 class HybridCar extends Car implements IGas {
  IGas mGasImpl;
  IBattery mBatteryImpl;   

  checkGas() {
    mGasImpl.checkGas();
  }
  checkBattery() {
    mBatteryImpl.checkBattery();
  }
}
  
  1. Если вы хотите работать с EventBus , вы должны сохранить подписчиков в качестве интерфейса активности, но также делегировать его реализацию обработчикам. Итак, в HybridActivity :
   @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowGasEvent(){
     mGasImpl.onLowGasEvent();
  }

  @Subscribe(threadMode = ThreadMode.MAIN)
  function onLowBatteryEvent(){
    mBatteryImpl.onLowBatteryEvent();
  }
  

Если onLow...Event требуется Context , обновите методы интерфейса, чтобы передать его в качестве параметра.

Надеюсь, это поможет.

Комментарии:

1. Поскольку Activity является особенным, он поставляется с событиями жизненного цикла activity. Итак, как мы можем использовать это в этом случае?

2. @CodingTT, я не уверен, что полностью понимаю вашу проблему. Не могли бы вы привести какой-нибудь пример?

3. Я обновил вопрос, я думаю, что в нем есть больше информации по вопросу

4. @CodingTT, спасибо, теперь все намного понятнее. У меня очень мало опыта EventBus , но я думаю, что предлагаемый подход все еще возможен. Пожалуйста, ознакомьтесь с обновленным ответом

Ответ №2:

Java не имеет множественного наследования. Вам нужно будет сделать так, чтобы объект Car имел общие методы, которые вы хотите использовать.

Ответ №3:

Как предполагает @Kristy Whesh, Java не допускает множественного наследования…но есть интерфейсы!

Просто сделайте что-то вроде этого:

-Создайте два интерфейса: один для бензинового автомобиля, а другой для электромобиля.

-Ваш гибридный автомобиль реализует эти два интерфейса, поэтому у вас есть две функции, которые вам нужно проверить.

-Ваши старые классы car реализуют правильный интерфейс в соответствии с их типом.

Надеюсь, это поможет или даст вам подсказку.

Приветствия