2011-02-07 7 views
2

Я новичок в Java, и я начал изучать его на Android платформе, я знаю его не очень хорошо, чтобы начать изучение языка на эмуляции мобильной платформы, но в любом случае ....Java «внешний по вызову события»

То, что я хотел бы спросить о java, является «внешним» вызовом некоторых методов. Я имею в виду, часто в программе или учебниках, вы просто ovveride какой-то метод, и он автоматически запускается на основе некоторых действий.

Это очень приятно на самом деле, мне это очень нравится, но я хотел бы знать, как это реализовано. Должна ли JVM реализовать их или как-то они определяются пользователем?

Для axample на Android есть методы surfaceCreated(),surfaceDestroyed(), которые вызываются соответствующим событием, и вы, чем можете его обработать. Аналогичным является обработка кликов и многое другое.

Я просто хотел бы знать, как это реализовано, потому что, например, в C вы должны вручную проверить, произошло ли какое-либо действие или нет. И вы ограничены данными, предоставленными ОС. Итак, имеет ли JVM предопределенные действия, которые он может вызывать, или вы можете как-то вручную сказать что-нибудь на что-нибудь, основанное на somthing? Я знаю, что это странный вопрос, но на самом деле это так странно для меня, что я не могу объяснить это лучше. Может быть, вы можете понять мое незнание, если бы вы знали, что я программировал в основном для MCU на C, так что это поведение странно для меня. Но мне нравится это.

ответ

1

Это называется Event-Delegation Model.

При возникновении любого события, если слушатели зарегистрированы, вызываются соответствующие делегаты.

иметь в виду, что дело все упс в этом и будет рассматриваться в терминах классов и объектов

Мы можем понять это из очень простого примера говорят о кнопки мыши.

Рассмотрим я сделать этот класс

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

Теперь увидеть этот класс реализует интерфейс. Этот класс должен предоставить телу пустой метод интерфейса для его реализации. иначе код не будет компилироваться.

Это гарантирует, что каждый объект этого класса имеет тело метода onClick. Теперь давайте зарегистрируем это, чтобы прослушать нажатие кнопки.

сказать, что моя Кнопка button01

button01.setOnClickListener(new MyButtonClickListener()); 

Рассмотрим теперь объект button01 имеет список поддерживается в нем где-то, который имеет адрес объекта, чтобы сделать что-то позже (новый MyButtonClickListener() в нашем случае).

теперь менеджеры компоновки закодированы таким образом, что при наступлении события (например, нажмите кнопку) отправьте это событие в список прослушивателя объектов, чтобы выполнить дальнейшие действия.

Это будет происходить в моде, когда кнопка будет нажата, а список кнопок прослушивателя проверяется, если он найден не null, что означает, что есть слушатель. теперь по ссылке, найденной в списке, вызывается метод 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() в каждом из них.

Смежные вопросы