2011-02-07 20 views
2

我新的Java和我开始学习它在Android平台上,我知道它不是好的开始在移动平台上的仿真语言学习,但无论如何....Java“的事件调用外部”

我想问一些关于java的问题,是一些方法的“外部”调用。我的意思是,通常在程序或教程中,你只是使用某种方法,然后根据某些操作自动运行。

这实际上是非常好的,我非常喜欢它,但我想知道这是如何实现的。 JVM是否必须实现这些功能,或者它们是否可以用户自定义?

对于Android上的axample方法是在相应事件上调用的方法surfaceCreated(),surfaceDestroyed(),您可以处理它。类似的是按钮点击处理,以及更多的事件。

我只想知道这是如何实现的,因为,例如在C中,您必须手动检查某个动作是否发生。而且你受OS提供的数据限制。那么,JVM是否具有可以调用的预定义操作,或者您是否可以手动以某种方式告诉它基于某些事情执行某些操作?我知道这是一个奇怪的问题,但实际上对我来说很奇怪,我无法更好地解释它。也许你可以理解我的不知道,如果你知道我主要为C编写了MCU,所以这种行为对我来说很奇怪。但我喜欢它。

回答

1

这被称为事件委托模型。

如果监听者注册时发生任何事件,则调用合适的代表。

记住的事情一切都是哎呀在此,将在类条款处理和对象

我们可以从一个很简单的例子理解这个按钮点击的说。

考虑我使这个类

class MyButtonClickListener implements OnClickListener 
{ 
    public void onClick(View v) 
    { 
      //do something on button click 
    } 
} 

现在看到这个类实现一个接口。这个类必须提供接口的空方法来实现它。否则代码将无法编译。

这可确保此类的每个对象都具有onClick方法的主体。现在让我们注册这个来听我们的按钮点击。

说我的按钮被button01

button01.setOnClickListener(new MyButtonClickListener()); 

现在考虑对象button01中有某个地方保持一个列表,它具有对象的地址做(在我们的情况下,新MyButtonClickListener())的东西后。

现在布局管理器以一种事件发生的方式进行编码(例如按下按钮),将此事件发送到对象监听器列表以执行进一步操作。

这将以时尚的方式发生,当点击按钮时,然后检查侦听器的按钮列表,如果它被发现不是空的,这意味着有一个侦听器。现在在列表中找到参考,onClick方法被调用。特别是onClick被调用,因为我们调用setOnCLickListener来设置侦听器。如果您将检查此方法的代码。你会发现方法正在接收OnClickListener引用。这是一个实现OnClickListener接口的类的对象,因此必须提供一个onClick方法的主体。

并且因此执行该委托。这只是哎呀。我希望我能够把它解释得很好。

0

你问两个不同的东西:

一些方法,你可以重写,当一些动作发生被称为(的onResume(),...)。它们总是被调用(通过运行时/框架),当你的类重写它们时,你的实现被调用。但代码中的某处是实际调用此方法的地方。这些被称为virtual methods

在您订阅的按钮点击事件是类似的,但那是event-driven programming。当您订阅一个按钮单击事件,例如

foo.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
        ... do stuff 
      } 
} 

foo对象的地方保存OnClickListener到它的内部。当按钮被点击时,它会在它的内部看看它是否保存了任何OnClickListeners,如果是的话,它会在它们每一个中调用onClick()方法。