Хорошо, предположим, что, например, вы хотите, чтобы части вашей программы уведомлялись, когда ваш Loader запускает сканирование и когда он заканчивает сканирование (не беспокойтесь о том, что такое Loader или что такое сканирование, эти примеры из некоторого кода, который я лежал с моей последней работы). Вы определяете интерфейс, называете его «ScanListener», например
public interface ScanListener
{
public void scanStarted();
public void scanCompleted();
}
Теперь Loader определяет метод для вашего другого кода для регистрации обратных вызовов, например
public void addScanListener(ScanListener listener)
{
listeners.add(listener);
}
Загрузчик при запуске сканирования выполняет следующий код
for (ScanListener listener : listeners)
{
listener.scanStarted();
}
и когда он заканчивается, он делает то же самое с listener.scanCompleted ();
Код, который необходимо уведомлять об этих событиях, реализует этот интерфейс (либо сами, либо во внутреннем классе) и вызывает «loader.addScanListener (this)». Его методы scanStarted () и scanCompleted () вызываются в соответствующее время. Вы даже можете сделать это с помощью обратных вызовов, которые принимают аргументы и / или возвращают результаты. Это все зависит от вас.