Android - что-нибудь похожее на обратные вызовы делегатов iPhone SDK? - PullRequest
23 голосов
/ 23 сентября 2010

Я только что переключился с iPhone на Android и ищу что-то похожее на то, где в iPhone SDK, когда класс завершает определенную задачу, он вызывает методы делегата в объектах, установленных как его делегаты.

Iне нужно слишком много деталей.Я просмотрел документы и ничего не нашел (самое близкое, что я получил, это «намерения вещания», которые больше похожи на уведомления iOS).

Даже если кто-то может указать мне правильную документацию, было бы здорово.

Спасибо!

Ответы [ 5 ]

16 голосов
/ 24 сентября 2010

Неважно ... нашел ответ здесь:)

http://www.javaworld.com/javaworld/javatips/jw-javatip10.html


Вставка из статьи, чтобы сохранить ее:

Разработчики, знакомые с управляемой событиями программной моделью MS-Windows и X Window System, привыкли передавать функциональные указатели, которые вызываются (то есть «перезваниваются»), когда что-то происходит.Объектно-ориентированная модель Java в настоящее время не поддерживает указатели на методы, и поэтому, похоже, не позволяет использовать этот удобный механизм.Но еще не все потеряно!

Поддержка интерфейсов в Java предоставляет механизм, с помощью которого мы можем получить эквивалент обратных вызовов.Хитрость заключается в том, чтобы определить простой интерфейс, который объявляет метод, который мы хотим вызвать.

Например, предположим, что мы хотим получать уведомление, когда происходит событие.Мы можем определить интерфейс:

public interface InterestingEvent
{
    // This is just a regular method so it can return something or
    // take arguments if you like.
    public void interestingEvent ();
}

Это дает нам контроль над любыми объектами классов, которые реализуют интерфейс.Таким образом, нам не нужно заниматься какой-либо другой посторонней информацией типа.Это гораздо приятнее, чем взламывание функций батута C, которые используют поле данных виджетов для хранения указателя объекта при использовании кода C ++ с Motif.

Класс, который будет сигнализировать о событии, должен ожидать объекты, реализующие * 1020Интерфейс * InterestingEvent , а затем, при необходимости, вызовите метод интересноEvent () .

public class EventNotifier
{
    private InterestingEvent ie;
    private boolean somethingHappened; 
    public EventNotifier (InterestingEvent event)
    {
    // Save the event object for later use.
    ie = event; 
    // Nothing to report yet.
    somethingHappened = false;
    } 
    //...  
    public void doWork ()
    {
    // Check the predicate, which is set elsewhere.
    if (somethingHappened)
        {
        // Signal the even by invoking the interface's method.
        ie.interestingEvent ();
        }
    //...
    } 
    // ...
}

В этом примере я использовал предикат thingHappened , чтобы отслеживатьили нет событие должно быть запущено.Во многих случаях сам факт того, что метод был вызван, достаточен, чтобы гарантировать сигнализацию интересноEvent () .

Код, который желает получить уведомление о событии, должен реализовывать InterestingEvent интерфейса и просто передайте ссылку на себя уведомителю о событии.

public class CallMe implements InterestingEvent
{
    private EventNotifier en; 
    public CallMe ()
    {
    // Create the event notifier and pass ourself to it.
    en = new EventNotifier (this);
    } 
    // Define the actual handler for the event.
    public void interestingEvent ()
    {
    // Wow!  Something really interesting must have occurred!
    // Do something...
    } 
    //...
}

Это все, что нужно сделать.Я надеюсь, что использование этой простой идиомы Java сделает ваш переход на Java немного менее нервным.

5 голосов
/ 06 мая 2014

Основное содержание этого видеоурока - показать, как использовать интерфейсы для делегирования методов / обмена данными между различными фрагментами и действиями, но это отличный пример, чтобы узнать, как шаблон делегата может быть реализован в Java для Android.

enter image description here

4 голосов
/ 21 января 2019

Кулон для котлина.

Определите ваш интерфейс: в моем примере я сканирую кредитную карту с помощью внешней библиотеки.

interface ScanIOInterface {
     fun onScannedCreditCard(creditCard: CreditCard)
}

Создайте класс, в котором вы можете зарегистрировать Activity / Fragment.

class ScanIOScanner {
  var scannerInterface: ScanIOInterface? = null

  fun startScanningCreditCard() {
      val creditCard = Library.whichScanCreditCard() //returns CreditCard model
      scannerInterface?.onScannedCreditCard(creditCard)
  }
}

Реализация интерфейса в вашем Activity / Fragment.

class YourClassActivity extends AppCompatActivity, ScanIOInterface {
    //called when credit card was scanned
    override fun onScannedCreditCard(creditCard: CreditCard) {
        //do stuff with the credit card information
    }

    //call scanIOScanner to register your interface
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
       super.onViewCreated(view, savedInstanceState)

       val scanIOScanner = ScanIOScanner()
       scanIOScanner.scannerInterface = this
    }
} 

CreditCard - это модель, которую можно определить так, как вам нравится.В моем случае это бренд, цифры, срок действия ...

После этого вы можете звонить scanIOScanner.startScanningCreditCard() куда хотите.

1 голос
/ 11 апреля 2014

Мне кажется, ListAdapter - пример шаблона делегирования в Android.

1 голос
/ 05 ноября 2012

Обратный вызов Java - это не то же самое, что делегат ios, в ios можно использовать обратный вызов почти так же, как в Android. В Android есть startActivityForResult, который может помочь вам реализовать задачи, для которых используется делегат ios.

...