Абстрактное занятие выполнено 2-мя работами ненадлежащим образом - PullRequest
0 голосов
/ 06 марта 2019
  1. Домашняя деятельность
  2. Активность GeneralPlayer

Я делаю 2 действия с абстрактным классом extends, который содержит абстрактный метод. Абстрактный метод имеет различную реализацию во всех 2 классах.

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

когда я перейду ко второму (GeneralPlayer) действию. затем вызов абстрактного метода., что тоже хорошо, но когда я пришел к домашнему занятию, чем здесь вызов абстрактного метода действия GeneralPlayer, что неправильно. Здесь реализация абстрактного метода домашней активности должна вызывать ..

посмотрите на код

abstract class PlayerAbstractClass() : AppCompatActivity() {
      protected fun initiliseUIHandler(){
        Constants.PLAYER_UI = Handler(object : Handler.Callback {
            override fun handleMessage(msg: Message?): Boolean {
                updateButtonUI()
                return true
            }
        })
     }
     protected abstract fun updateButtonUI()
}

class GeneralPlayer : PlayerAbstractClass() {
    override fun onCreate(savedInstanceState: Bundle?) {
        initiliseUIHandler()
    }

    override fun updateButtonUI() {
      Log.i("MusicPlayer","activity")
  }
}

class Home : PlayerAbstractClass(){
    override fun onCreate(savedInstanceState: Bundle?) {
        initiliseUIHandler()
    }

   override fun updateButtonUI() {
      Log.i("HOME","activity")
   }
}

Так что, когда приложение запускается, Домашняя активность вызывает его печать ГЛАВНАЯ: активность когда я заходил в GeneralPlayer, он печатал MusicPlayer: активность

Выше оба утверждения в порядке. но когда я снова вернулся на домашнюю активность, он вызвал MusicPlayer: активность , что не так, он должен вызвать HOME: активность

Подскажите пожалуйста, что я делаю не так

1 Ответ

1 голос
/ 06 марта 2019

Вы устанавливаете Constants.PLAYER_UI на Handler последнего созданного Действия. Итак, вот что происходит:

  • Вы создаете Home, он создает Constants.PLAYER_UI Handler со ссылкой на Home, которая затем вызывает правильный метод.
  • Затем вы переходите к GeneralPlayer. Это сбрасывает Constants.PLAYER_UI Handler с GeneralPlayer созданным Handler. Он содержит ссылку на GeneralPlayer, поэтому он вызывает правильный метод.
  • Вы возвращаетесь к Home. Однако onCreate() не вызывается, так как Home уже создан. Таким образом, Constants.PLAYER_UI все еще ссылается на обработчик, созданный GeneralPlayer . Поэтому, когда этот метод вызывается (откуда-то еще), он использует действие GeneralPlayer, на которое он ссылается, и выводит сообщение GeneralPlayer.

Вам нужно, чтобы Handler был константой? Это может быть просто переменная экземпляра в действии, так что новый экземпляр создается с каждым действием и уничтожается вместе с ним:

abstract class PlayerAbstractClass() : AppCompatActivity() {
    private val playerUiHandler = Handler(object : Handler.Callback {
        override fun handleMessage(msg: Message?): Boolean {
            updateButtonUI()
            return true
        }
    })

    protected abstract fun updateButtonUI()
}

Таким образом, ваша Home активность имеет свой собственный экземпляр playerUiHandler, который будет вызываться каждый раз, когда вы находитесь на Home, и аналогично GeneralPlayer будет иметь другой экземпляр playerUiHandler, который вызывается, когда вы ' на этой деятельности. В качестве дополнительного бонуса вы больше не пропускаете Context и держите ссылки на действия, которые должны были быть уничтожены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...