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