Подтвердить что ты не робот

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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.

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

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 method.
        ie.interestingEvent ();
        }
    //...
    } 
    // ...
}

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

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

Ответ 2

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

enter image description here

Ответ 3

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

Ответ 4

Я считаю, что ListAdapter является примером шаблона делегирования в Android.

Ответ 5

Подвеска для котлина.

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

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() где угодно.