博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android的回调
阅读量:6933 次
发布时间:2019-06-27

本文共 4837 字,大约阅读时间需要 16 分钟。

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

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

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

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

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

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

 先看目录结构:

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

package wyl.MoniAndroidCallback;/** * 谁要通知,谁就实现这个接口 * @author wyl * */public interface ITongzhi {	public void Tongzhi();}

  Linda.java

package wyl.MoniAndroidCallback;/** * linda要对弟弟进行举报,所以linda实现通知接口 *  * @author wyl */public class Linda implements ITongzhi {	@Override	public void Tongzhi() {		System.out.println("Linda说:弟弟去打游戏了");	}}

  PlayGame.java,

 

package wyl.MoniAndroidCallback;public class PlayGame {	String name;	ITongzhi tongzhizhe;	/**	 * 打游戏的具体对象	 * 	 * @param name	 */	public PlayGame(String name) {		this.name = name;	}	/**	 * 如果实例化的时候不传入具体是谁在打游戏, 那么打游戏的具体对象就默认为Jhon	 */	public PlayGame() {		this.name = "Jhon";	}	/**	 * 开始打游戏了,因为打游戏的时候就要通知, 所以在打游戏这个方法里我们就调用实习了	 * ITongzhi这个接口的类的默认方法(这个默认方法即接口中定义的方法)	 */	public void Dayouxi() {		System.out.println(this.name + "正在打游戏");		tongzhizhe = new Linda();		tongzhizhe.Tongzhi();	}}

  Test.java ,测试类

package wyl.MoniAndroidCallback;/** * 测试类 *  * @author wyl *  */public class Test {	public static void main(String[] args) {		/**		 * 两个不同的构造器构造出来的方法,可以作为对比		 */		PlayGame p = new PlayGame("Tom");		PlayGame p2 = new PlayGame();		p.Dayouxi();		System.out.println("=========================");		p2.Dayouxi();	}}

  打印结果:

Tom正在打游戏Linda说:弟弟去打游戏了=========================Jhon正在打游戏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             @Override15             public void onClick() {16                 // TODO Auto-generated method stub17                 System.out.println("我是回调函数,实现了OnclickListener()接口.....");18             }19         });20         v.Click();21     }22 23 }

打印结果:

Button按钮被点了......

我是回调函数,实现了OnclickListener()接口.....

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

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

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

转自:

如下:

回调机制在 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     6  7     public void OnClick(Button b); 8  9  10 11 }12 13 2. 定义Button14 15 public class Button {16 17   OnClickListener listener;18 19  20 21   public void click() {22 23     listener.OnClick(this);24 25   }26 27   public void setOnClickListener(OnClickListener listener) {28 29     this.listener = listener;30 31   }32 33 }34 35 3. 将接口对象OnClickListener 赋给 Button的接口成员36 37 public class Activity {38 39   public Activity() {40 41   }42 43   public static void main(String[] args) {44 45     Button button = new Button();46 47     button.setOnClickListener(new OnClickListener(){48 49        @Override50 51        public void OnClick(Button b) {52 53                  System.out.println("clicked");54 55        }   56 57     });58 59     button.click(); //user click,System call button.click();60 61   }62 63 }

 

转载地址:http://vpgjl.baihongyu.com/

你可能感兴趣的文章
mysql导入excel数据
查看>>
Java中写入文件时换行符用"\r\n"、"\n"、"\r"?
查看>>
AIX 命令
查看>>
安装终端服务和终端服务授权,激活终端服务授权
查看>>
朋友,别在降低别人底线或被别人降低底线了!
查看>>
先考学历还是先提升能力?
查看>>
软件项目开发无成熟框架套路之成本代价
查看>>
设计模式(3)-装扮你的类(装饰模式)
查看>>
Android 数字签名学习笔记
查看>>
Linux下Gedit + Gmate ,实用的编辑器
查看>>
OO学习之二——面向对象分析(OOD)的介绍
查看>>
深入python3 (Dive Into Python 3) 在线阅读与下载
查看>>
linux 更改服务的启动顺序
查看>>
【数据结构】除去线性表中的重复数字
查看>>
[原]IE9 DOM的自定义属性问题
查看>>
[CLR via C#]17. 委托
查看>>
Android系统Google Maps开发实例浅析
查看>>
支持向量机(SVM)算法
查看>>
445port入侵具体解释
查看>>
The command 'new_value' for SQLPlus
查看>>