Разница между обратным вызовом и событием - PullRequest
1 голос
/ 29 марта 2020

В чем разница между Callback и событием в программировании Asyn c и Syn c?

Что я понял о стандарте кодирования Syn c, так это то, что обратный вызов - это часть, которая выполняется после каждого события кусок кода? И следующее событие не будет вызвано, пока не будет выполнен последний фрагмент кода обратного вызова. Правильно ли это?

Во-вторых, при кодировании ASyn c, после выполнения части кода события вызывается часть кода обратного вызова. И независимо от того, выполняется последний фрагмент кода обратного вызова или нет, он будет вызывать следующее событие и соответствующий обратный вызов и так далее. Это правильно?

Что, я думаю, обратный вызов может вести себя как подтверждение к событию выполнения кода (может быть и другой смысл).

Я читал этот блог https://www.geeksforgeeks.org/asynchronous-synchronous-callbacks-java/

Где я нашел ниже комментарий об Асине c и не мог правильно понять?

An Asynchronous call does not block the program from the code execution. When the call returns from the event, the call returns back to the callback function.

Означает ли это, что при выполнении кода события вызывается код обратного вызова?

// Java program to illustrate synchronous callback 
interface OnGeekEventListener { 

    // this can be any type of method 
    void onGeekEvent(); 
} 

class B { 

    private OnGeekEventListener mListener; // listener field 

    // setting the listener 
    public void registerOnGeekEventListener(OnGeekEventListener mListener) 
    { 
        this.mListener = mListener; 
    } 

    // my synchronous task 
    public void doGeekStuff() 
    { 

        // perform any operation 
        System.out.println("Performing callback before synchronous Task"); 

        // check if listener is registered. 
        if (this.mListener != null) { 

            // invoke the callback method of class A 
            mListener.onGeekEvent(); 
        } 
    } 

    // Driver Function 
    public static void main(String[] args) 
    { 
        B obj = new B(); 
        OnGeekEventListener mListener = new A(); 
        obj.registerOnGeekEventListener(mListener); 
        obj.doGeekStuff(); 
    } 
} 

class A implements OnGeekEventListener { 

    @Override
    public void onGeekEvent() 
    { 
        System.out.println("Performing callback after synchronous Task"); 
        // perform some routine operation 
    } 
    // some class A methods 
} 

Последнее сомнение, В приведенном выше коде, если код события (doGeekStuff()) обрабатывается, и для выполнения кода события поступает другой запрос, приведенный выше код не будет выполнен или будет ожидать обработки текущего события?

1 Ответ

2 голосов
/ 29 марта 2020

Событием может быть что угодно, например, прикосновение к экрану телефона, нажатие кнопки, нажатие клавиши, потеря соединения и т. Д. c.

И обратный вызов является ответом на эти события

В программировании, управляемом событиями, мы получаем метод обратного вызова, который вызывается, когда происходит какое-то событие.

Управляемое событием программирование обычно реализуется с помощью шаблона проектирования, называемого шаблоном наблюдателя.

from head first design patters Обратные вызовы в основном реализуются путем реализации интерфейса наблюдателем, вызывающим объект, вызывающий событие. методы обратного вызова для наблюдателя при каждом событии, и эти методы наверняка определены наблюдателем, поскольку он реализует этот интерфейс, интерфейс является своего рода контрактом между объектом, управляющим событиями, и наблюдателем (эй, наблюдатель, я даю вам обратный вызов, только если вы реализуете этот интерфейс)

В вашем коде этот интерфейс

interface OnGeekEventListener { 
// this can be any type of method 
void onGeekEvent(); 
} 

onGeekEvent(); будет вызываться для объектов наблюдения, когда происходит событие.

В выше код класс B является субъектом / производителем , когда вы вызываете метод ниже для экземпляра класса B passin g ваш объект, такой как classBobj.registerOnGeekEvent(classAobj) it , регистрирует вас как слушателя / наблюдателя / потребителя, и помещает ваш объект в переменную-член mListener, теперь, когда происходит событие, он может вызывать метод onGeekEvent() для этого объекта.

 public void registerOnGeekEventListener(OnGeekEventListener mListener) 
{ 
    this.mListener = mListener; 
} 

Синхронный обратный вызов , когда код внутри этих методов выполняется так же, из которого объект события вызывает их, он является синхронным.

Таким образом, если код вызывается в одном и том же потоке, вы не можете выполнить два параллельных события, потому что поток один и тот же, поэтому пишется «до выполнения lastcallback»

пример -> как будто у вас есть только один ребенок, и вы отправляете его брать воду, затем вы можете отправить его брать пищу, пока он не вернется с водой (так же, как вы не можете казнить другого обратный вызов)

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

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

пример -> Это похоже на то, что у вас много детей, которых вы отправляете одному пить воду, пока он набирает воду, поэтому пошлите другого за едой, потом другого, чтобы принести вам кофе и так далее

...