- Create callback function in Android
- Как правильно реализовать callback в java?
- Android programmers blog
- Поиск по этому блогу
- понедельник, 5 октября 2015 г.
- Callback’и в Android
- Понимание callback-функций (колбеков)
- Функции — это объекты
- Передача функции как callback-функции
- Не загромождайте выход
- Русские Блоги
- Разговор об Android callback-CallBack
- Во-первых, прийти к выводу
- Во-вторых, обратные вызовы, которые можно увидеть везде
- 3. Попробуйте написать обратный звонок самостоятельно
- Пример 1
Create callback function in Android
In Android, you have to write lots of code for some actions. To reduce lines of code we use functions and classes to reuse the code but sometimes we need the callback of function. So here I will tell how to create the callback with an example.
Let take an example in Android, in most places we need a confirm dialog to confirm any action like delete the record, leave the page etc. The traditional way to do it create a confirm dialog and write code of confirm dialog positive callback. But this might take 13-15 lines to write the code. See the code snippet below:
Here you can see 15 lines of code required to confirm an action. Now we will create a function in our MyHelper class to confirm an action and this function will be reusable anywhere in the whole application.
In the above class, we have created the confirmDialog function that has a callback. The callback will be trigger when the user clicks on the confirm button.
In Android, we need Interface to create the callback. In our Example, we have created MyCallback Interface that has one method callbackCall. In the function confirmDialog we passed the callback object in the last and call the callback object’s function on Dialog button press: callback.callbackCall(); .
Now we will use this function in our activity as below:
As you can see here to confirm the action we need to write only 4 lines of code. confirmDialog function has the callback where you can write your code for your action.
Источник
Как правильно реализовать callback в java?
Я недавно начал для себя изучать Android и собственно java, до этого всегда писал на nodeJS, и за долгое время очень привык к js.
И вот, в процессе изучения, настал момент, когда я решил написать один единственный класс который будет отправлять запросы, и в результате ошибки или успеха будет выполнять соответствующие методы класса из которого мы и шлем этот запрос.
Есть класс MainActivity в котором по клику на кнопку шлем запрос на сервер и ответ вставляем в TextView. Сейчас я реализовал коллбэки таким образом:
Такой вот для теста абстрактный класс DoRequestClass
С интерфейсом DoRequestInterface
Все описанное выше работает, но можно ли как-то передать successReq и errorReq в DoRequestClass таким образом, как бы мы это делали это на javascript, о то что я имею ввиду, о желанном результате, смотрите как бы я хотел примерно чтоб они передавались:
Как вы поняли из кода выше, setSuccessCallback и setErrorCallback это методы которые будут говорить классу DoRequestClass какие методы класса MainActivity нужно выполнить после успешного или не успешного запроса.
Такое или подобное прекрасно работало бы в javascript’e, но такой java-код работать не будет. Вопрос в том, как создать что-то такое или приближенное к этому? И возможно ли вообще? Суть в том чтобы не писать лишний код и создавать лишнее методы типа как в моем рабочем примере onOK и onError.
Прошу вас по возможности дать как можно более развернутый ответ с пояснениями, т.к. мои познания в java совсем не велики.
Источник
Android programmers blog
Simply about difficult
Поиск по этому блогу
понедельник, 5 октября 2015 г.
Callback’и в Android
Еще решил написать одну заметку по поводу коллбеков. Штука интересная и полезная, без нее редко когда получается что то разумное написать. По этому решил что надо будет написать пару примеров по работе с колбеками.
Для начала хочу сказать что есть разные библиотеки типа EventBus и OttoBus которые сделают всю работу за вас и еще больше сделают… Но иногда эти библиотеки сильно много делают для обычной тривиальной задачи, например вернуть респонс из AsyncTask’a или еще что-то похожее, из-за этого использовать эти библиотеки не целесообразно и достаточно написать один интерфейс и вызывать его в нужном месте по тому или иному событию. Собственно это я сегодня и хочу продемонстрировать на примере приложения.
У нас будет небольшой апп который будет тянуть список спорт. каналов через AsyncTask, парсить то что вернет сервер с помощью кастомного JsonArray и JsonObject и отдавать это все колбеком в активити для отображения в списке.
Для начала давайте сделаем небольшую настройку. Для работы с интернетом нам нужен премишен в манифесте, давайте его добавим.
И сделаем разметку с списком, все будет елементарно и просто.
Все, с настройками мы закончили, теперь давайте кодить!
Первый вариант Callback’a, получение данных в Activity
Первый вариант у нас будет такой как я описал выше, он имеет вот такую архитектуру:
Это очень краткий пример того что будет происходить. Создаем интерфейс, далее в классе который нам должен что-то вернуть вызываем этот колбек что бы можно было отследить когда он выполнился, а после этого отображаем то что вернул колбек в нашей активити которая включает в себя собственно этот колбек.
Очень сумбурно, нам нужно более детальное рассмотрение этого способа по этому начну.
У вас должен уже быть создан пустой проект с MainActivity, нам она пока не понадобится, мы ее будем использовать в в самом конце.
Сейчас создайте новый класс который будет называться BackgroundTask, в этом методе у нас будет AsyncTask который у нас будет хватать json строку с удаленного сервера.
Вообще использовать AsyncTask не советую, для таких нужд есть прекрасная библотека Retrofit или Volley или еще куча разных великолепных библиотек которые делают запросы и не валятся при повороте экрана. По этому это чисто пример, так как я сделал запрос лучше не делать, повторюсь, лучше используйте готовые решения.
Вот как то так у нас будет работать наш AsyncTask, но пока что вам не хватает нескольких классов которые выполняют кое какую работу, давайте их напишем что бы все заработало. Нам не хватает интерфейса ResponseCallback, так давайте создадим его.
Так же нам не хватает ChannelsModel, давайте и его создадим.
А еще нам не хватает ChannelsParser который парсит нашу json возвращенную с сервера. Держите, мне не жалко!
Вот! Вроде бы картинка у нас обрисовалась и все нужные классы были созданы. Теперь нам нужно все это собрать в одно, отобразить наш заветный список на экране. Разметка у нас уже готова по-этому нам осталось сделать адаптер и вызвать его в MainActivity. Вот это мы сейчас и сделаем, создаем еще один класс ChannelsAdapter и заполняем его.
Так, тут все просто я думаю все сталкивались с кастомными адаптерами по этому сильно вникать не буду. Если же не сталкивались то у меня в блоге есть статья где я описываю создание кастомного адаптера. Вернемся к функциям, в адаптере мы принимаем ArrayList с данными и отображаем его в TextView который я беру из ресурсов android’a. Собственно и все. Давайте уже наконец закончим и вызовем это все в MainActivity.
Вот так вот просто на примере можно увидеть как работают коллбеки. Но это не все, еще есть второй вариант колбеков которые работают через Setters и Getters. Я на примере этой же программы покажу как это делается, там так же ничего сложного нет.
Второй вариант Callback’a, работа через setters и getters
Как и с первым вариантом во втором я приведу абстрактный пример того как он должен выглядеть в кратце.
Интерфейс можно создавать где угодно и как угодно, по этому не обязательно его выносить в отдельный класс, можно создать как внутри активити или асинк таска так и внутри адаптера и любого другого класса. Создается интерфейс, объявляется, дальше вызывается его инстанс, то есть метод который должен отработать во время евента. А потом в Activity или Fragment’e идет вызов этого метода и получение нужных данных из него. В общем пример опять сумбурный, сейчас на примере нашей программы сделаем и будет все понятно.
Для начала в нашем адаптере нужно создать интерфейс. В самом низу класса пишем вот такое:
Дальше нам надо создать setter для этого интерфейса что бы можно было вызывать его во время создания адаптера и передавать туда наш колбек.
Теперь в getView пишем onClickListener для создания евента клика по айтему:
Вот так должен выглядеть адаптер в целом
А теперь нам нужно перенести в MainActivity этот функционал. Для этого нам нужно присвоить адаптеру новый сеттер и передать туда новый объект нашего коллбека.
В целом MainActivity должна выглядить таким образом
Вот так вот при использовании коллбеков можно достичь дзена. Надеюсь все было понятно так как пока я это писал меня двадцать пять раз отвлекли и я все эти разы терял мысль по этому возможно что то может быть черезчур запутано, спрашивайте если что то не понятно. В любом случае есть исходники рабочие, по ним так точно можно разобраться (:
Источник
Понимание callback-функций (колбеков)
Функции — это объекты
Чтобы понимать callback-функции, нужно понимать обычные функции. Это может показаться банальностью, но функции в Javascript’е — немного странные штуки.
Функции в Javascript’е — на самом деле объекты. А именно, объекты класса Function , создаваемые конструктором Function . В объекте Function содержится строка с JS-кодом данной функции. Если вы перешли с языка C или Java, это может показаться странным (как код может быть строкой?!), но, вообще говоря, в Javascript’е такое сплошь и рядом. Различие между кодом и данными иногда размывается.
Преимущество концепции «функция-как-объект» заключается в том, что код можно передавать в другую функцию точно так же, как обычную переменную или объект (потому что в буквальном понимании код — всего лишь объект).
Передача функции как callback-функции
Передавать функцию в качестве аргумента просто.
Может показаться глупостью создавать такой перемудрённый код, когда можно вернуть значение нормальным способом, но существуют ситуации, в которых это непрактично и callback-функции необходимы.
Не загромождайте выход
Традиционно функции в ходе выполнения принимают на вход аргументы и возвращают значение, используя выражение return (в идеальном случае единственное выражение return в конце функции: одна точка входа и одна точка выхода). Это имеет смысл. Функции — это, в сущности, маршруты между вводом и выводом.
Javascript даёт возможность делать всё немного по-другому. Вместо того чтобы дожидаться, пока функция закончит выполняться и вернёт значение, мы можем использовать callback-функции, чтобы получить его асинхронно. Это полезно для случаев, когда требуется много времени для завершения, например, при AJAX-запросах, ведь мы не можем приостановить браузер. Мы можем продолжить заниматься другими делами в ожидании вызова колбека. Фактически, очень часто от нас требуется (или, точнее, нам настоятельно рекомендуется) делать всё асинхронно в Javascript’е.
Вот более детальный пример, в котором используется AJAX для загрузки XML-файла и используется функция call() для вызова callback-функции в контексте запрошенного объекта (это значит, что когда мы укажем ключевое слово this внутри callback-функции, оно будет ссылаться на запрошенный объект):
В этом примере мы создаём объект httpRequest и загружаем файл XML. Типичная парадигма возвращения значения в конце функции тут больше не работает. Наш запрос обрабатывается асинхронно, а это означает, что мы начинаем запрос и говорим ему вызвать нашу функцию, как только он закончится.
Мы используем здесь две анонимных функции. Важно помнить, что нам бы не составило труда использовать и именованные функции, но во имя лаконичности мы сделали их вложенными. Первая анонимная функция выполняется всякий раз при изменении статуса в нашем объекте httpRequest. Мы игнорируем это до тех пор, пока состояние не будет равно 4 (т.е. запрос выполнен) и статус будет равен 200 (т.е. запрос выполнен успешно). В реальном мире вам бы захотелось проверить, не провален ли запрос, но мы предполагаем, что файл существует и может быть загружен браузером. Эта анонимная функция связана с httpRequest.onreadystatechange, так что она выполняется не сразу, а вызывается каждый раз при изменении состояния в нашем запросе.
Когда мы наконец завершаем наш AJAX-запрос, мы не просто запускаем callback-функцию, мы используем для этого функцию call() . Это ещё один способ вызова callback-функции. Метод, использованный нами до этого — простой запуск функции здесь сработал бы хорошо, но я подумал, что стоит продемонстрировать и использование функции call() . Как вариант, можно использовать функцию apply() (обсуждение разницы между ней и call() выходят за рамки этой статьи, скажу лишь, что это затрагивает способ передачи аргументов функции).
В использовании call() замечательно то, что мы сами устанавливаем контекст, в котором выполняется функция. Это означает, что когда мы используем ключевое слово this внутри нашей callback-функции, оно ссылается на то, что мы передаём первым аргументом в call() . В данном примере, когда мы ссылались на this внутри нашей анонимной функции, мы ссылались на responseXML, полученный в результате AJAX-запроса.
Источник
Русские Блоги
Разговор об Android callback-CallBack
Эта статья из короткого книжного блога «Амин Кирен», пожалуйста, укажите источник для перепечатки или цитирования.
Я улыбаюсь, я всегда считал, что в разработке программного обеспечения не так уж много редких вещей. Первоначальное намерение иностранных экспертов в области дизайна также просто и красиво, но в процессе передачи знаний, перевода и личного понимания это привело к недоразумениям.
Первоначальный вид языка программного обеспечения должен быть простым и красивым.
Несколько дней назад студент из университета спросил меня, что происходит с обратным вызовом, и это было основной причиной, по которой я хотел написать эту статью. Я не хочу накапливать принципы и невнятные слова, а просто описать это так, как мне кажется, легче понять.
Помните, что при изучении обратных вызовов я всегда чувствую, что обратные вызовы — это странная вещь. Действительно, вам нужно идти глубже. Есть действительно много вещей, которые нужно сказать, но как разработчик, я чувствую, что у меня есть определенный технический момент или пункт знаний. Простое и хорошо понятое познание очень важно, и необходимо сказать, что очень важно иметь общее познание.
Во-первых, прийти к выводу
Обратный вызов означает, что A и B имеют отношения сотрудничества. Для определенной части A требуется, чтобы B сам сказал A, что делать. Это обратный вызов. Обратный вызов должен иметь интерфейс)
Во-вторых, обратные вызовы, которые можно увидеть везде
Мы знаем, что обратные вызовы можно увидеть повсюду в Android, например, событие нажатия кнопки
.
.
Далее, давайте посмотрим на исходный код setOnClickListener, а затем посмотрим на замечания
Другие Google сказали, что этот метод является обратным вызовом, они являются обратным вызовом
Обратный вызов должен иметь интерфейс
.
.
(в основном все виды setOnClickListener являются обратными вызовами, а все виды слушателей являются обратными вызовами)
Прочитав это, давайте кратко подтвердим наш вывод.
Пожалуйста, сделайте вывод:
Обратный вызов означает, что A и B имеют отношения сотрудничества. Определенная связь A требует, чтобы B сказал A, что делать. Это обратный вызов (обратный вызов должен иметь интерфейс
В упомянутом выше небольшом примере View — это то, что мы называем A, а наша MainActivity — это то, что мы называем B (TextView наследует от View, мы все знаем), затем мы нажимаем B и хотим сделать что-то Только B знает это, A определенно не знает, что B хочет делать, и тогда A должен иметь свою собственную логику, чтобы просто работать в соответствии с B, так что, ах, это . «Определенная связь A требует, чтобы B сказал A. Как сделать»
Поскольку в A есть метод, который можно вызывать обратно, в A. должен быть интерфейс.
3. Попробуйте написать обратный звонок самостоятельно
Пока вы написали пользовательский элемент управления, вы должны написать обратный вызов. Это естественно, и смысл этой статьи — просто описать понимание обратных вызовов.
На самом деле, делать обратные вызовы очень хорошо, например, мы сделали пользовательский индикатор выполнения, кнопку или переключатель и т. Д. Нам всем нужно создать интерфейс обратного вызова. Каковы преимущества? Люди, которые используют наши элементы управления, могут сами выбирать некоторые вещи, вместо того, чтобы писать интерфейс, мы можем предоставить некоторые методы, чтобы другие могли выбрать цвет, размер, значение и так далее.
Пример 1
Мы предполагаем, что сделали пользовательскую кнопку переключения, а затем нажимаем ее, чтобы изменить текст другого элемента управления. (Только для демонстрации, без переключателя, чтобы не делать код слишком длинным)
После щелчка вызывающая сторона должна выполнить некоторую логику. Что касается конкретной логики, которая должна быть выполнена, это совсем не наше дело. Это то, что хочет делать человек, использующий наш контроль.
Простой пользовательский контроль
Как и выше, демонстрация приложения обратного вызова завершена.
Конечно, вы также можете сказать, что я напрямую использую ваш mTog для вызова метода setOnClickListener в MainActivity. Разве это не та же функция, что и выше! Да, верно, но мы здесь не для реализации функций, а для того, чтобы кратко описать, как определить интерфейс для реализации обратных вызовов.
Кроме того, как и выше, является демонстрацией корректировки порядка, и немного дальше, мы, конечно, можем также добавить параметры в onDoClick при написании интерфейса, такие как void onDoClick (DiyToggle diyToggle, Boolean toggleState); Таким образом, мы можем указать, какой DiyToggle становится каким состоянием переключения.
.
.
нота
Последняя работа — DiyToggle, а почему A в конце может изменить текст, это собственное системное событие onTouchEvent со сложным дизайном Android, благодаря которому DiyToggle может делать очень много вещей.
Код обычно выполняется по порядку. Нам нужно объяснить mTog, который реализует интерфейс в MainActivity, то есть метод onDoClick подходит для DiyToggle Положение, чтобы после вызова mTog метода setToggleClickListener была выполнена учетная запись mTog.
Источник