学了两三周的安卓了,最先开始是看mars老师的视频,看了一两天结合慕课网上的一些安卓视频,到现在算是有点入门了。

安卓立用得比较多的回调函数有点不明是怎么实现的,网上找了一些资料,结合自己的实践,总算有点明白了。

  现在就把我自己对Java回调的理解写下来,以方便以后查阅。

比如我们执行一个方法的时候,Android系统就会帮我们调用oncreate()等方法,Android中有大量这样的情形。我们可以这样想,我们执行方法A的时候,系统

怎么就能够帮我们方法B了呢?这种肯定什么我们还没明白的地方。实际上很简单,只要我们在方法A里写上调用方法B,不就可以实现调用A的时候就自动调用B方

法了吗?下面我们就模拟这样一个场景,Jhno去打游戏的时候小明的妹妹Linda就会通知Dad说Jhon打游戏了。

先看目录结构:

先定义一个通知接口,interface ITongzhi,

  1. package wyl.MoniAndroidCallback;
  2. /**
  3. * 谁要通知,谁就实现这个接口
  4. * @author wyl
  5. *
  6. */
  7. public interface ITongzhi {
  8. public void Tongzhi();
  9. }

  Linda.java

  1. package wyl.MoniAndroidCallback;
  2.  
  3. /**
  4. * linda要对弟弟进行举报,所以linda实现通知接口
  5. *
  6. * @author wyl
  7. */
  8. public class Linda implements ITongzhi {
  9.  
  10. @Override
  11. public void Tongzhi() {
  12. System.out.println("Linda说:弟弟去打游戏了");
  13.  
  14. }
  15.  
  16. }

  PlayGame.java,

  1. package wyl.MoniAndroidCallback;
  2.  
  3. public class PlayGame {
  4. String name;
  5. ITongzhi tongzhizhe;
  6.  
  7. /**
  8. * 打游戏的具体对象
  9. *
  10. * @param name
  11. */
  12. public PlayGame(String name) {
  13. this.name = name;
  14. }
  15.  
  16. /**
  17. * 如果实例化的时候不传入具体是谁在打游戏, 那么打游戏的具体对象就默认为Jhon
  18. */
  19. public PlayGame() {
  20. this.name = "Jhon";
  21. }
  22.  
  23. /**
  24. * 开始打游戏了,因为打游戏的时候就要通知, 所以在打游戏这个方法里我们就调用实习了
  25. * ITongzhi这个接口的类的默认方法(这个默认方法即接口中定义的方法)
  26. */
  27. public void Dayouxi() {
  28. System.out.println(this.name + "正在打游戏");
  29. tongzhizhe = new Linda();
  30. tongzhizhe.Tongzhi();
  31. }
  32. }

  Test.java ,测试类

  1. package wyl.MoniAndroidCallback;
  2.  
  3. /**
  4. * 测试类
  5. *
  6. * @author wyl
  7. *
  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11. /**
  12. * 两个不同的构造器构造出来的方法,可以作为对比
  13. */
  14. PlayGame p = new PlayGame("Tom");
  15. PlayGame p2 = new PlayGame();
  16. p.Dayouxi();
  17. System.out.println("=========================");
  18. p2.Dayouxi();
  19. }
  20. }

  打印结果:

  1. Tom正在打游戏
  2. Linda说:弟弟去打游戏了
  3. =========================
  4. Jhon正在打游戏
  5. Linda说:弟弟去打游戏了

  实际上,Linda.java这个类,还可以进行改进,实现进一步的解耦。只要明白了这个例子,肯定就知道怎么进行解耦了。

再举一个例子,模仿安卓中的onClickListener接口。

OnclickListener.java,

  1. package Huidiao;
  2.  
  3. /**
  4. * 我自己定义的一个接口,含有 onClick()方法
  5. *
  6. * @author Wyl
  7. *
  8. */
  9. public interface OnclickListener {
  10. public void onClick();// 用来给具体实现OnclickListener接口的类写具体逻辑的
  11. }

View.java,

  1. package Huidiao;
  2.  
  3. /**
  4. * 模拟安卓中的view控件
  5. *
  6. * @author Wyl
  7. *
  8. */
  9. public class View {
  10.  
  11. public OnclickListener listener;
  12.  
  13. public void setOnclickListener(OnclickListener l) {
  14. this.listener = l;
  15. }
  16.  
  17. public void Click() {
  18. System.out.println("Button按钮被点了......");
  19. listener.onClick();// 调用接口中未实现的onClick()函数。
  20. }
  21. }

Test.java,

  1. package Huidiao;
  2.  
  3. /**
  4. * 测试类
  5. *
  6. * @author Wyl
  7. *
  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11. View v = new View();
  12. v.setOnclickListener(new OnclickListener() {
  13.  
  14. @Override
  15. public void onClick() {
  16. // TODO Auto-generated method stub
  17. System.out.println("我是回调函数,实现了OnclickListener()接口.....");
  18. }
  19. });
  20. v.Click();
  21. }
  22.  
  23. }

打印结果:

Button按钮被点了......
我是回调函数,实现了OnclickListener()接口.....

结合这两个例子,理解安卓中的回调函数应该就不是问题了。

===============================分割线=============================

网上还找到一个类似的实例:

转自:http://blog.sina.com.cn/s/blog_645b74b901015d4j.html

如下:

回调机制在 Android 监听用户界面操作中的体现

本文讨论以下两个内容:

1. 回调函数

2. 回调机制在 Android框架 监听用户界面操作中的作用

一 回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

Java 中没有指针的概念,通过接口和内部类的方式实现回调的功能:

1. 定义接口 Callback ,包含回调方法 callback()

2. 在一个类Caller 中声明一个Callback接口对象 mCallback

3. 在程序中赋予 Caller对象的接口成员(mCallback) 一个内部类对象如

  1. new Callback(){
  2.  
  3. callback(){
  4.  
  5. //函数的具体实现
  6.  
  7. }

这样,在需要的时候,可用Caller对象的mCallback接口成员 调用callback()方法,完成回调.

二、回调机制在 Android框架 监听用户界面操作中的作用

Android事件侦听器是视图View类的接口,包含一个单独的回调方法。这些方法将在视图中注册的侦听器被用户界面操作触发时由Android框架调用。回调方法被包含在Android事件侦听器接口中:

例如,Android 的view 对象都含有一个命名为 OnClickListener 接口成员变量,用户的点击操作都会交给 OnClickListener的 OnClick() 方法进行处理。

开发者若需要对点击事件做处理,可以定义一个 OnClickListener 接口对象,赋给需要被点击的 view的接口成员变量OnClickListener,一般是用 view 的setOnClickListener() 函数来完成这一操作。

当有用户点击事件时,系统就会回调被点击view的OnClickListener接口成员的OnClick()方法。

实例(对于Android界面上Button点击事件监听的模拟):

  1. 1.定义接口
  2.  
  3. public interface OnClickListener {
  4.  
  5. public void OnClick(Button b);
  6.  
  7. }
  8.  
  9. 2 定义Button
  10.  
  11. public class Button {
  12.  
  13. OnClickListener listener;
  14.  
  15. public void click() {
  16.  
  17. listener.OnClick(this);
  18.  
  19. }
  20.  
  21. public void setOnClickListener(OnClickListener listener) {
  22.  
  23. this.listener = listener;
  24.  
  25. }
  26.  
  27. }
  28.  
  29. 3 将接口对象OnClickListener 赋给 Button的接口成员
  30.  
  31. public class Activity {
  32.  
  33. public Activity() {
  34.  
  35. }
  36.  
  37. public static void main(String[] args) {
  38.  
  39. Button button = new Button();
  40.  
  41. button.setOnClickListener(new OnClickListener(){
  42.  
  43. @Override
  44.  
  45. public void OnClick(Button b) {
  46.  
  47. System.out.println("clicked");
  48.  
  49. }
  50.  
  51. });
  52.  
  53. button.click(); //user click,System call button.click();
  54.  
  55. }
  56.  
  57. }

Android的回调的更多相关文章

  1. Android异步回调中的UI同步性问题

    Android程序编码过程中,回调无处不在.从最常见的Activity生命周期回调开始,到BroadcastReceiver.Service以及Sqlite等.Activity.BroadcastRe ...

  2. Android中回调接口的使用

    MainActivity如下: package cn.testcallback; import android.os.Bundle; import android.app.Activity; /** ...

  3. 弄明白Android 接口回调机制

    以前对于这个机制理解不够深刻,现在重新整理下思路. 一.建模 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机 ...

  4. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  5. Android接口回调机制

    开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...

  6. android之回调函数的意义

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 看完这篇文后大家可以看看这个http://blog. ...

  7. Android的回调模拟

    想要彻底理解安卓中用的回调,最好的办法是自己写一个类似的实现安卓中回调功能的实现方法. 我自己写了一个可以实现setOnClickListener回调的工程: 具体目录: 工程源码的具体地址:http ...

  8. JAVA和Android的回调机制

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以 前不理解什么叫回 ...

  9. Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存

    ImageUtil.java import android.graphics.ImageFormat; import android.media.Image; import android.os.Bu ...

随机推荐

  1. 关于已经安装python为何还要安装python-dev

    linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包. 以python为例, 以下情况你是需要python-dev的 你需要自己安装一个源外的pyt ...

  2. [转]如何理解c和c ++的复杂类型声明

    本文作者girlrong是网易广州社区的C语言版版主,这篇文章被选在精华区.很是不错,不敢独享!据说她乐于助人,虚心诚恳,颇受网友欢迎.只可惜现在已退隐江湖了.在最近学习C语言过程中,了解些前辈大牛的 ...

  3. 不用注册热键方式在Delphi中实现定义快捷键(又简单又巧妙,但要当前窗体处在激活状态)

    第一步:在要实现快捷键的窗体中更改属性“KeyPreview”为True:第二步:在要实现快捷键的窗体中的OnKeyPress事件中填入一个过程名称(在Object Inspector中),填写好后回 ...

  4. Spinner样式大全

    Spinner样式大全

  5. Spring Boot Admin Reference Guide

    1. What is Spring Boot Admin? Spring Boot Admin is a simple application to manage and monitor your S ...

  6. spring boot 下 500 404 错误页面处理

    spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单的,用java config或者xml的形式,定义如下的be ...

  7. 转:详细解说 STL 排序(Sort)

    详细解说 STL 排序(Sort) 详细解说 STL 排序(Sort) 作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1. ...

  8. openScales源码学习系列之 Feature属性

    coordinates:当前区域,geometry或Polygon的点集合. countries.国家所在位置下标 SQKM.平方千米 COLOR_MAP.该国家的颜色类别 SQMI.平方英里 CON ...

  9. 此windows副本不是正版解决方法

    老爸的win7今天黑屏 右下角出现 Windows7 内部版本7601 此windows副本不是正版 网上零散地找到了解决办法 写博汇总一下 我的情况是 电脑属性中的windows激活显示: 状态不可 ...

  10. TCP编程的一个小例子

    TCP程序的服务器端与客户端的流程图 例子:服务器端等待客户端连接,若连接成功,则用户可以通过客户端向服务器端发送任意字符串,服务器端在收到字符串后,输出相关信息,在把接受到的字符串重新发生给客户端. ...