2活动工作未正确实施抽象类

时间:2019-03-06 15:41:31

标签: android kotlin

  1. 家庭活动
  2. GeneralPlayer活动

我通过包含抽象方法的扩展抽象类进行了2个活动。在所有两个类中,抽象方法都有不同的实现。

当应用启动时,它将返回首页活动并调用其在抽象类中声明为abstract的方法。很好。

何时我要进行第二(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")
   }
}

因此,当应用启动家庭活动时,会调用它打印 HOME:活动 当我去GeneralPlayer时,它会打印 MusicPlayer:活动

以上两种说法都可以。 但是当我再次进行家庭活动时,它会调用 MusicPlayer:activity ,这是错误的,应该调用 HOME:activity

请告诉我我做错了什么

1 个答案:

答案 0 :(得分:1)

您正在将@implementation XYZFlippedView - (BOOL) isFlipped { return YES; } @end 设置为最近创建的活动的Constants.PLAYER_UI。所以这是正在发生的事情:

  • 您创建Handler,并创建对Home的引用的Constants.PLAYER_UI Handler,然后调用正确的方法。
  • 然后您转到Home。这会用创建的GeneralPlayer的{​​{1}}重设Constants.PLAYER_UI Handler。它引用了GeneralPlayer,因此它调用了正确的方法。
  • 您返回到Handler。但是,未调用GeneralPlayer,因为已经创建了Home。因此onCreate() 仍在引用GeneralPlayer创建的处理程序。因此,当调用该方法(从其他地方我想)时,它使用的是Home活动,该活动保留了对它的引用,并输出Constants.PLAYER_UI消息。

您需要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也会有不同的{{ 1}}实例,当您进行该活动时会被调用。另外,您不再泄漏Home并保留对本应销毁的活动的引用。