Как работает событие обратного вызова "XYZ"? - PullRequest
2 голосов
/ 23 ноября 2011

Я ищу объяснения концепции или пример кода, если это возможно

Я новичок в разработке (android) и из того, что я видел, есть масса методов "onEvent ()". например, View.onClickListener (), onPageDownload, onProgressUpdate ... я заметил, что все начинается с "on", и я предполагаю, что это означает, что метод является событием обратного вызова? это то же самое, что и обработчик?

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

скажем, я хочу создать обработчик onImageDownloaded(), который будет вызываться при наступлении определенного события. как, например, я загружаю изображение, и я хочу вызвать событие, когда изображение загружается (и да, я получаю, что есть что-то под названием AsyncTask, а также публикую сообщение, которое можно запустить из фоновой ветки, но по педагогическим причинам давайте представим процесс мог бы быть и в потоке пользовательского интерфейса). Как Android узнает, как вызвать метод onImageDownloaded()? или, скорее, как мне указать, что когда изображение загружается, я хочу, чтобы оно вызывало мой метод onImageDownloaded()?

Я читал о намерениях вещания, но это скорее системный уровень и что-то вроде этого.

Я знаю, что когда вы делаете кнопку в представлении, вы можете сделать

final Button b = (Button) findViewById(R.id.mybutton);
b.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("MyActivity", "button is clicked");
    }
});

и это почти как установка «крючка» на кнопку, которая вызывает конкретный «onClick», когда происходит событие click.

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

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

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

Нам нужно сначала узнать, что такое обратный вызов:

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

Википедия: Обратный звонок

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

Допустим, у вас есть class, который загружает данные из Интернета. Если вы хотите сделать класс более пригодным для повторного использования, вы определите protocol (любую конструкцию class), которой он будет сообщать. Позже classes, который соответствует этому протоколу (или реализует этот протокол), может соответственно использовать загруженные данные.

Обратные вызовы обычно выполняются с использованием ключевого слова interface, но также можно использовать abstract class или простой class.

Вот простая иллюстрация, как сделать и использовать наши собственные обратные вызовы .

2 голосов
/ 23 ноября 2011

Простой пример того, что происходит:

XYZer xyzer=new XYZer();
xyzer.setXYZListener(new XYZListener() {

    public void onXYZ(View v) {
        Log.d("MyActivity", "XYZ happened");
    }
});

class XYZer
{
    XYZListener listener;
    void setXYZListener(XYZListener listener){this.listener=listener;}

    void test(View v)
    {
        if(listener!=null)listener.onXYZ(v);
    }
}

HTH.Извините, у меня нет времени для более длинных объяснений, надеюсь, кто-то другой предоставит это.

1 голос
/ 23 ноября 2011

Одним из способов достижения механизма обратного вызова является использование интерфейса.

В следующих уроках приведен хороший пример механизма обратного вызова.

http://about -android.blogspot.com / 2010/02 / create-custom-dialog.html .

взгляните на интерфейс ReadyListener, который имеет единственный метод

public void ready(String name);
...