Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
Dmitry Andreev
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 67
1

CallBack -Обратный вызов

05.05.2013, 10:13. Просмотров 9549. Ответов 5

Не могу вкурить обратные вызовы в Java. По Вики - это передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет в функции исполнять код, который задаётся в аргументах при её вызове.
В Java этот механизм можно реализовать, например, с помощью интерфейсов.
Вот как я это понимаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface X{
  void hello();
}
 
class A implements X{
  public void hello(){System.out.println("Hello");}
}
 
class Caller{
  static void callBack(X x){x.hello();}
}
 
class test{
  public static void main(String[] args){
    A a = new A();
    Caller.callBack(a);
  }
}
Правильно ли я понял?
Спасибо за ответ.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 10:13
Ответы с готовыми решениями:

Обратный вызов. javax.swing.Timer
http://pro-java.ru/java-dlya-nachinayushhix/interfejsy-i-obratnyj-vyzov/ ActionListener listener...

Подскажите книгу где бы разъяснялось про работу CallBack (Обратный вызов) функций
Здравствуйте. Подскажите пожалуйста книгу где бы разъяснялось про работу CallBack (Обратный вызов)...

Обратный вызов из DLL (CALLBACK)
В справке описано, что CALLBACK ф-я должна иметь такой вид: typedef struct { UINT16 Year;...

Вызов callback после WM_CREATE
есть такой callback LRESULT CALLBACK newTest(int nCode, WPARAM wParam, LPARAM lParam) Как мне его...

Асинхронный вызов: Abort и Callback
Всем привет! Недавно начал разбираться с многопоточностью в .NET. 1) Мне нужно запустить...

5
Mysterious Light
Эксперт по математике/физике
4094 / 2003 / 410
Регистрация: 19.07.2009
Сообщений: 3,022
Записей в блоге: 22
05.05.2013, 13:15 2
Так работает же, значит, правильно пишешь.
Не знаю как в Java, а много где именно x называют колбэком, потому что именно он устанавливает обратную связь, являясь мостом между Caller и соответствующей имплементацией X. У Caller метод может быть не только static.
Кстати, можно использують эту для отложных вызовов. Например:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface X{
  void hello();
}
 
class A implements X{
  public void hello(){System.out.println("Hello");}
}
 
class Caller{
  private X x;
  public Caller(X x){this.x=x;} // сохраняем
  void call(){this.x.hello();} // вызываем
}
 
class test{
  public static void main(String[] args){
    A a = new A();
    Caller caller = new Caller(a); // обратная связь установлена
    // ...
    caller.call(); // обратная связь в действии
  }
}
0
mutagen
2568 / 2241 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.05.2013, 14:12 3
не ребята чуть нетак
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.util.ArrayList;
import java.util.Random;
 
/**
 *
 * @author mutagen
 */
public class CallBackDemo {
 
    public static void main(String[] args) {
 
        Caller caller = new Caller();
 
        for (int i = 0; i < 10; i++) {
            new Worker(caller).start();
        }
//        итого у нас 9 воркеров отработали и вернули ответ по калбеку в коллекцию
        System.out.println(caller.getStatuses());
    }
 
    static class Caller implements Callback {
 
        private ArrayList<Integer> statuses = new ArrayList<>();
 
        public ArrayList<Integer> getStatuses() {
            return statuses;
        }
 
        @Override
        public void callMeBack(int status) {
//            тут может быть логика куда вернутся данные, может быть коллекция, я выбрал попроще
            synchronized (statuses) {
                statuses.add(status);
            }
        }
    }
 
    static interface Callback {
//        подготовим интерфейс по которому нам будут возвращать данные
 
        void callMeBack(int status);
    }
 
    static class Worker extends Thread {
 
        private Callback cb;
 
        public Worker(Callback cb) {
            this.cb = cb;
        }
 
        int pleaseDoMeAFavor() {
            return new Random().nextInt();
        }
 
        @Override
        public void run() {
//            выполним работу 
            int st = pleaseDoMeAFavor();
//            и вернём данные вызывающему по калбек интерфейсу
            cb.callMeBack(st);
        }
    }
}
3
Dmitry Andreev
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 67
05.05.2013, 22:38  [ТС] 4
в чем разница? Поясните, пожалуйста, mutagen
0
mutagen
2568 / 2241 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.05.2013, 23:11 5
Цитата Сообщение от Dmitry Andreev Посмотреть сообщение
в чем разница? Поясните, пожалуйста, mutagen
в вашем варианте работа выполняется в майн и ничего не возвращается калбеком.
у вас получается какбы каскад, вы вызвали один метод а он второй из X, это не калбек.

калбек в чистом виде, это когда вы сформировали задачу и отправили её выполнять какому то там процессу,
но не ждёте её завершения и продолжаете работать, а чтобы к вам мог вернутся результат работы,
вы для воркера передаёте ссылку на свой класс с кастом в интерфейс калбека в котором обьявлен метод
при помощи которого воркер может вернуть данные. Вся работа происходит асинхронно без блокировок и ожиданий.
В этом смысл калбеков, так как некоторые задачи могут идти долго, а некоторые быстро, но каллер не должен об этом
заботиться, он просто предоставляет интерфейс для ответа и продолжает работу
0
Dmitry Andreev
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 67
07.05.2013, 12:54  [ТС] 6
Спасибо mutagen за разъяснения. Меня смутил пример из книги Thinking in Java 4 Bruce Eckel:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//: innerclasses/Callbacks.java
// Using inner classes for callbacks
package innerclasses;
import static net.mindview.util.Print.*;
 
interface Incrementable {
  void increment();
}
 
// Very simple to just implement the interface:
class Callee1 implements Incrementable {
  private int i = 0;
  public void increment() {
    i++;
    print(i);
  }
}   
 
class MyIncrement {
  public void increment() { print("Other operation"); }
  static void f(MyIncrement mi) { mi.increment(); }
}   
 
// If your class must implement increment() in
// some other way, you must use an inner class:
class Callee2 extends MyIncrement {
  private int i = 0;
  public void increment() {
    super.increment();
    i++;
    print(i);
  }
  private class Closure implements Incrementable {
    public void increment() {
      // Specify outer-class method, otherwise
      // you'd get an infinite recursion:
      Callee2.this.increment();
    }
  }
  Incrementable getCallbackReference() {
    return new Closure();
  }
}   
 
class Caller {
  private Incrementable callbackReference;
  Caller(Incrementable cbh) { callbackReference = cbh; }
  void go() { callbackReference.increment(); }
}
 
public class Callbacks {
  public static void main(String[] args) {
    Callee1 c1 = new Callee1();
    Callee2 c2 = new Callee2();
    MyIncrement.f(c2);
    Caller caller1 = new Caller(c1);
    Caller caller2 = new Caller(c2.getCallbackReference());
    caller1.go();
    caller1.go();
    caller2.go();
    caller2.go();
  } 
}/* Output:
Other operation
1
1
2
Other operation
2
Other operation
3
*///:~
Я так понимаю автор здесь хотел показать использование внутренних классов для обратного вызова. Используя интерфейс Incrementable класс Callee2 возрвращает результат - экземпляр внутреннего класса Closure.
0
07.05.2013, 12:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2013, 12:54

Вызов callback для захвата фото с web cam
Народ, спасайте! Подскажите, из-за чего вылетает такая ошибка при установке простой функции...

Обратный вызов клиента
Может кто доступно объяснить принцип действия обратного вызова клиента и метода...

Существует ли обратный вызов в событиях?
Пожалуйста помогите. Добавлено через 17 минут &lt;Window x:Class=&quot;WpfApplication1.MainWindow&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru