Android的回调
学了两三周的安卓了,最先开始是看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,
package Huidiao; /**
* 我自己定义的一个接口,含有 onClick()方法
*
* @author Wyl
*
*/
public interface OnclickListener {
public void onClick();// 用来给具体实现OnclickListener接口的类写具体逻辑的
}
View.java,
package Huidiao; /**
* 模拟安卓中的view控件
*
* @author Wyl
*
*/
public class View { public OnclickListener listener; public void setOnclickListener(OnclickListener l) {
this.listener = l;
} public void Click() {
System.out.println("Button按钮被点了......");
listener.onClick();// 调用接口中未实现的onClick()函数。
}
}
Test.java,
package Huidiao; /**
* 测试类
*
* @author Wyl
*
*/
public class Test {
public static void main(String[] args) {
View v = new View();
v.setOnclickListener(new OnclickListener() { @Override
public void onClick() {
// TODO Auto-generated method stub
System.out.println("我是回调函数,实现了OnclickListener()接口.....");
}
});
v.Click();
} }
打印结果:
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) 一个内部类对象如
new Callback(){
callback(){
//函数的具体实现
}
这样,在需要的时候,可用Caller对象的mCallback接口成员 调用callback()方法,完成回调.
二、回调机制在 Android框架 监听用户界面操作中的作用
Android事件侦听器是视图View类的接口,包含一个单独的回调方法。这些方法将在视图中注册的侦听器被用户界面操作触发时由Android框架调用。回调方法被包含在Android事件侦听器接口中:
例如,Android 的view 对象都含有一个命名为 OnClickListener 接口成员变量,用户的点击操作都会交给 OnClickListener的 OnClick() 方法进行处理。
开发者若需要对点击事件做处理,可以定义一个 OnClickListener 接口对象,赋给需要被点击的 view的接口成员变量OnClickListener,一般是用 view 的setOnClickListener() 函数来完成这一操作。
当有用户点击事件时,系统就会回调被点击view的OnClickListener接口成员的OnClick()方法。
实例(对于Android界面上Button点击事件监听的模拟):
1.定义接口
public interface OnClickListener {
public void OnClick(Button b);
}
2. 定义Button
public class Button {
OnClickListener listener;
public void click() {
listener.OnClick(this);
}
public void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
}
3. 将接口对象OnClickListener 赋给 Button的接口成员
public class Activity {
public Activity() {
}
public static void main(String[] args) {
Button button = new Button();
button.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(Button b) {
System.out.println("clicked");
}
});
button.click(); //user click,System call button.click();
}
}
Android的回调的更多相关文章
- Android异步回调中的UI同步性问题
Android程序编码过程中,回调无处不在.从最常见的Activity生命周期回调开始,到BroadcastReceiver.Service以及Sqlite等.Activity.BroadcastRe ...
- Android中回调接口的使用
MainActivity如下: package cn.testcallback; import android.os.Bundle; import android.app.Activity; /** ...
- 弄明白Android 接口回调机制
以前对于这个机制理解不够深刻,现在重新整理下思路. 一.建模 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机 ...
- Android笔记二十四.Android基于回调的事件处理机制
假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...
- Android接口回调机制
开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...
- android之回调函数的意义
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 看完这篇文后大家可以看看这个http://blog. ...
- Android的回调模拟
想要彻底理解安卓中用的回调,最好的办法是自己写一个类似的实现安卓中回调功能的实现方法. 我自己写了一个可以实现setOnClickListener回调的工程: 具体目录: 工程源码的具体地址:http ...
- JAVA和Android的回调机制
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以 前不理解什么叫回 ...
- Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存
ImageUtil.java import android.graphics.ImageFormat; import android.media.Image; import android.os.Bu ...
随机推荐
- 5.7.1.3 Global 对象的属性
Global对象还包含了一些属性,例如,特殊的值undefined.NaN以及Infinity都是Global对象的属性.此外,所有原生引用类型的构造函数,像Object和Function,也都是Gl ...
- PhpStorm 10.0.1安装(win7-64位)
软件下载地址 http://www.xiazaiba.com/html/25261.html#j_down_list 或者:http://pan.baidu.com/s/1brSA9C 密码:tpc7 ...
- 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
1.#!/usr/bin/python 是用来说明脚本语言是 python 的 是要用 /usr/bin下面的程序(工具)python,这个解释器,来解释 python 脚本,来运行 python 脚 ...
- Linux 下的 fork()【转载】
[原文地址]http://blog.csdn.net/hikaliv/article/details/4276758 [cpp] view plaincopy for( i = 0; i < ...
- Mark Russinovich 的博客:Windows Azure 主机更新:原因、时间和方式
Mark Russinovich的技术博客涵盖 Windows故障排除.技术和安全等主题. Windows Azure主机更新:原因.时间和方式 Windows Azure的计算平台(其中包括 ...
- png的格式及像素存储分析
从图片的数据块存储方式来看png分两种 1.索引色模式存储.png8的索引色透明就采取该种方式.该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte).而图片的数据 ...
- Android 进程和线程模型
Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了. 在 Li ...
- [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘
[Problem Description] 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队 ...
- 设计模式 - 适配器模式(adapter pattern) 具体解释
适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...
- iOS离线打包
预备环境 iOS开发环境,Mac OS.XCode 7.2以上版本: 下载HBuilder离线打包iOS版SDK(5+ SDK下载). SDK目录说明 HBuilder-Hello:离线打包演示应用: ...