我通过包含抽象方法的扩展抽象类进行了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
请告诉我我做错了什么
答案 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
并保留对本应销毁的活动的引用。