Android 由2个活动执行的抽象类工作不正常 家庭活动 通用层活动

Android 由2个活动执行的抽象类工作不正常 家庭活动 通用层活动,android,kotlin,Android,Kotlin,我用包含抽象方法的extends抽象类创建了2个活动。抽象方法在所有2个类中都有不同的实现 当应用程序启动时,它将返回活动并调用在抽象类中声明为抽象的方法。很好 什么时候我将进入第二个(GeneralPlayer)活动。然后是它的抽象方法调用。这也很好,但当我回到主页时,活动比这里的GeneralPlayer活动抽象方法调用要多,这是错误的。此处home活动抽象方法实现应调用 看看代码 abstract class PlayerAbstractClass() : AppCompatActivit

我用包含抽象方法的extends抽象类创建了2个活动。抽象方法在所有2个类中都有不同的实现

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

什么时候我将进入第二个(GeneralPlayer)活动。然后是它的抽象方法调用。这也很好,但当我回到主页时,活动比这里的GeneralPlayer活动抽象方法调用要多,这是错误的。此处home活动抽象方法实现应调用

看看代码

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")
   }
}
因此,当应用程序启动主页活动时,将其称为printHome:activity 当我转到GeneralPlayer时,它会打印MusicLayer:activity

以上两种说法都可以。 但是当我再次参加家庭活动时,它会叫MusicPlayer:activity,这是错误的,它应该叫home:activity


请告诉我我做错了什么

您正在为最近创建的活动的
处理程序设置
常量.PLAYER\u UI
。下面是正在发生的事情:

  • 您创建
    Home
    ,它将创建
    常量.PLAYER\u UI
    处理程序
    ,并引用
    Home
    ,然后调用正确的方法
  • 然后转到
    GeneralPlayer
    。这将使用创建的
    处理程序
    重置
    常量.PLAYER\u UI
    处理程序
    。它包含对
    GeneralPlayer
    的引用,因此它调用正确的方法
  • 你回到
    主页
    。但是,
    onCreate()
    不会被调用,因为已经创建了
    Home
    。因此,
    Constants.PLAYER\u UI
    仍在引用GeneralPlayer创建的处理程序。因此,当调用该方法时(我假设是从其他地方调用),它将使用它持有引用的
    GeneralPlayer
    活动,并输出
    GeneralPlayer
    消息
是否需要将
处理程序
设置为常量?您可以让它只是活动上的一个实例变量,这样每个活动都会创建一个新实例,并与之一起销毁:

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
实例,当您在该活动中时会被调用。作为额外的好处,您不再泄漏
上下文
,也不再持有对本应销毁的活动的引用

你是如何回家的?使用设备的“后退”按钮?通过应用程序中的按钮?请向我们显示所有代码我刚刚更新了代码我想这可能会有帮助我按下设备后退按钮返回家庭活动谢谢,兄弟。我知道当我再次返回时,不会调用home activity onCreate()。但我忘了重新初始化handler。我忘了那个处理程序仍然引用GeneralPlayer创建的处理程序。再次感谢。。。