我是Java的新手,我开始在Android平台上学习它,我知道开始学习移动平台仿真语言并不好,但无论如何....
我想问的关于java的问题,是“外部”调用某些方法。我的意思是,通常在程序或教程中,你只需要一些方法,它会根据某些动作自动运行。
实际上这非常好,我真的很喜欢它,但我想知道这是如何实现的。 JVM必须实现这些,还是以某种方式用户定义?
对于Android上的axample,方法surfaceCreated(),surfaceDestroyed()
会在相应的事件上调用,而您可以处理它。类似的是按钮点击处理,以及更多的事件。
我想知道这是如何实现的,因为例如在C中你必须手动检查是否发生了某些动作。并且您受到OS提供的数据的限制。那么,JVM是否已预先定义了可以调用的操作,或者您可以手动以某种方式告诉它根据某些事情做某些事情吗?我知道这是一个奇怪的问题,但事实上它对我来说很奇怪,我无法更好地解释它。也许你可以理解我不知道你是否知道我主要为C编程的MCU编程,所以这种行为对我来说很奇怪。但我喜欢它。
答案 0 :(得分:1)
这称为事件委派模型。
如果注册了侦听器,则发生任何事件时,将调用正确的代理。
请记住,事情一切都是oops,并将根据类和对象进行处理
我们可以通过一个非常简单的按钮点击示例来理解这一点。
考虑我制作这个课程
class MyButtonClickListener implements OnClickListener
{
public void onClick(View v)
{
//do something on button click
}
}
现在看到这个类正在实现一个接口。这个类必须提供body来实现它的空接口方法。否则代码将无法编译。
这可确保此类的每个对象都具有onClick方法体。现在让我们注册这个来听我们的按钮点击。
说我的按钮是button01
button01.setOnClickListener(new MyButtonClickListener());
现在考虑对象button01在其中有一个列表,其中有一个对象的地址以便稍后做某事(在我们的例子中是新的MyButtonClickListener())。
现在布局管理器的编码方式是,在事件发生时(比如按钮点击)将此事件发送到对象侦听器列表以执行进一步操作。
这将以时尚的方式发生,当点击按钮然后检查监听器的按钮列表,如果发现它不是null,则意味着有一个监听器。现在在列表中找到的引用上,调用onClick方法。因为我们调用了setOnCLickListener来设置监听器,所以调用了onClick。如果你要检查这个方法的代码。你会发现方法是接收OnClickListener引用。这是实现OnClickListener接口的类的对象,因此必须为onClick方法提供一个主体。
因此执行此委派。这只是哎呀。我希望我能够将它解释到一个很好的水平。
答案 1 :(得分:0)
你问两件不同的事情:
您可以覆盖的一些方法,在某些操作发生时调用(onResume(),...)。它们总是被调用(由运行时/框架),当您的类重写它们时,将调用该方法的实现。但代码中的某处是对此方法的实际调用。这些被称为virtual methods。
您订阅的按钮点击事件类似,但event-driven programming。订阅按钮单击事件时,例如
foo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
... do stuff
}
}
foo
对象将OnClickListener保存到其内部的某处。单击该按钮时,如果它保存了任何OnClickListener,它将在其内部查找,如果是,则在每个按钮中调用onClick()方法。