English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В начале изучения этой механики я не очень хорошо понимал ее, теперь я хочу重新 организовать свои мысли. В разработке интерфейсный вызов обратной функции — это то, что мы часто используем.
Значение интерфейсного вызова обратной функции в том, что после регистрации не выполняется сразу, а выполняется в определенный момент.
Сначала давайте решим, что такое обратная функция:
Давайте举个例子: однажды я позвонил тебе, чтобы поинтересоваться проблемой, конечно, это была сложная проблема, ты не мог сразу найти решение, и я не мог просто сидеть на телефоне и ждать, поэтому мы договорились: как только ты найдешь решение, позвони мне по телефону, и я повеслю телефон, чтобы заняться другими делами. Через XX минут мой телефон зазвонил, и ты с радостью сказал, что проблема решена, и она должна быть решена так.
C не может вызвать b himself, цель предоставления b C — это чтобы S вызывал его, и C не может не предоставлять. S не знает, что такое предоставленный C b, поэтому S согласовывает спецификацию интерфейса b (prototype функции), а затем C заранее через функцию r S сообщает S, что он собирается использовать функцию b (регистрация). r — это функция регистрации.
Кратко говоря: обратная функция — это функция, отведенная для системного вызова, и мы часто знаем, когда эта функция вызывается, поэтому продолжим улучшать上图。
Взглянув на это изображение, давайте подумаем об этом, и мы обнаружим, что в жизни везде есть такое思想. Многие идеи в программном обеспечении на самом деле являются трансформацией нашего стиля мышления в реальной жизни.
Что первое мы делаем, когда пишем ответы на экзамене? Конечно, это пишем номер студента и имя. Обратите внимание, что мы пишем номер студента и имя не для себя (т.е. этот метод не вызывается нами), а для того, чтобы учитель мог зарегистрировать оценки (предоставлен для будущего вызова системы), это и есть применение callback. Учитель предоставляет интерфейс (ввод имени, правила ввода номера студента), и мы используем этот интерфейс для регистрации.
После изучения этого маленького примера у вас должно сложиться некоторое представление о callback, теперь вернемся к примеру в начале статьи.
Этот пример объясняет программный режим "асинхронный + callback". Когда вы后来 звоните мне и говорите результат, это процесс callback; мой номер телефона должен быть вам известен заранее, это регистрация callback-функции; мой номер телефона должен быть действителен, и телефон должен быть способен принимать вызовы, что соответствует спецификации интерфейса callback-функции.
Мы уже大致了解了回调ный процесс, давайте теперь посмотрим на основные случаи использования callbacks в Android.
Сцена 1:
Button button = (Button)this.findViewById(R.id.button); button.setOnClickListener(new Button.OnClickListener() { // функциональный callback @override public void onClick(View v) { buttonTextView.setText("Кнопка была нажата"); } });
Этот код добавляет списокeners к кнопке, что является одним из наиболее распространенных применений callbacks. Мы не вызываем явно метод onClick. После того как пользователь активирует событие нажатия кнопки, это будет автоматически вызываться Android-системой.
Сцена 2:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(saveInstanceState); // You code... } @Override public void onResume() { super.onResume(); // You code... }
Весь жизненный цикл Activity, по сути, использует функции回调.
Изучив два наиболее часто используемых нами способа回调, давайте сначала подведем итоги основных методов использования回调 в Android. На самом деле, это просто перевод нашей схемы.
--你类--
package lin.callback.test; public class You implements Runnable{ private String who; private ContactInterface callBack; public You() { // TODO Автоматически сгенерированный конструктор } //Этот метод означает, что с тобой связался кто-то, зарегистрируй его здесь public void setCallBack(String who, String question, ContactInterface callBack) { this.who = who; System.out.println("Ты сказал: Тот, кто связался со мной, это " + who + " с вопросом " + question); this.callBack = callBack; } public void handleThings(){ //Предположим, что сейчас ты думаешь о ответе на проблему и тебе нужно время for(int i=0;i<100000;i++){ if(i == 0){ System.out.println("Ты думаешь о проблеме....."); } } String answer = "答案是A"; //找到了解决问题的方法 System.out.println("Ты сказал: Нашел ответ, готов позвонить " + who + " чтобы сказать ему ответ"); callBack.callBackByTel(answer); } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { try { Thread.sleep(1000); handleThings(); } catch (Exception e) { e.printStackTrace(); } } }
--Моя класс--
public class Me { public static void main(String[] args){ Me me = new Me(); me.hasQuestion(); } private void hasQuestion(){ //现在有问题想不出来答案,想去问你 You you = new You(); you.setCallBack("蜗牛", "答案是什么?", new ContactInterface() { @Override public void callBackByTel(String answer) { System.out.println("Я говорю: да, хорошо, я получил ответ: " + answer + " спасибо"); } }); //Ты принимаешь телефонный звонок, встаешь и начинаешь думать о проблеме new Thread(you).start(); } }
--Класс интерфейса (стандарт)--
public interface ContactInterface { public void callBackByTel(String answer); }
Проверка результатов:
Ты говоришь: сейчас ко мне обратился улитка, проблема - что за ответ на这道 вопрос?
Ты думаешь о проблеме
Ты говоришь: я думаю о проблеме, готов вернуться к улитке и告诉她 ответ
Я говорю: да, хорошо, я получил ответ: ответ - A, спасибо
Глубокое размышление о回调:
Фактически программа - это переход кода, независимо от синхронного, асинхронного, отражения интерфейса виртуальной функции, по сути, это вызов функции. Функция, которую мы вызываем, требует указателя на нее, и различные языки получают этот указатель разными способами. А интерфейсы, которые мы определяем, на самом деле являются указателями функций, поэтому процесс регистрации其实就是 присвоение значения этому указателю функции. Вызовим пользовательскую функцию, которую мы определили, через этот указатель функции.
Вот и все, что есть в этой статье, надеюсь, это поможет вам в изучении, также希望大家多多支持呐喊教程。
Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат авторам, материалы предоставлены пользователями Интернета, сайт не имеет права собственности, не был обработан вручную, не несет ответственности за связанные с этим法律责任. Если вы обнаружите спорное содержимое о правах на авторство, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @) для жалоб,并提供 соответствующие доказательства. При подтверждении факта侵权, сайт незамедлительно удалят спорное содержимое.