安卓回调函数解决不同类之间函数调用和数据通信的问题
2017-05-11 14:23
405 查看
欢迎转载,请注明转载自安卓订阅号(安卓编程入门进阶)。
百度云原清晰度地址:http://pan.baidu.com/s/1mhS0H8O
安卓回调函数的意义:
安卓中其实随处可见回调函数,用户在手机上执行的大部分操作都会产生一个回调事件,例如Button点击,listView的点击等。这些控件的回调函数都已经在安卓系统中内置写好,程序员使用上面的成熟控件只需要编写回调函数部分,即回调事件实际执行的部分。但是编写安卓程序不可避免的需要一些线程之类的特性。如上一节课程,如果线程是直接在MainActivity中初始化的,那么可以使用handler将数据传递到UI进程,但很明显,随着程序的功能增多,把所有的线程全部定义到MainActivity中很不现实。如果新建一个线程类,就需要解决线程类把结果实时通知到主线程并刷新UI的问题,安卓的回调机制就可以很好的解决此问题。回调的解释网上很多(如http://blog.csdn.net/wojiaotianyong/article/details/70948632),也有很多例程,本课程通过实际操作演示回调函数定义和创建的过程,程序通过创建子线程类,在子线程中每一秒读取一次系统时间,然后通过回调函数将数据传递到MainActivity中。
注意:虽然回调函数的函数体是在MainActivity.java中,但是这部分函数的执行还是属于子线程,如果要使用此数据刷新UI线程,还是需要使用handler(参见上一节课程)。
1、 创建一个空的工程,名为LearnCallback。
2、 在xml界面上添加一个button控件ID=btnStart用于启动子线程,再添加一个TextView控件ID=tvOut用于显示每秒产生的日期和时间输出。
3、 在MainActivity.java中为两个xml控件添加初始化。并设置button的监听事件。
4、 在包名上右键新建一个新的接口命名为CallBackMain,在类中添加一个CallbacktoMain方法参数为字符串类型用于传递字符串,结束。
5、在包名上右键新建一个新的类命名为B,继承自Thread类。声明一个CallBackMain对象,在类中添加一个SetCallback函数,参数为CallBackMain对象,函数体中将线程类中的CallBackMain对象指向传进来的参数。
6、在子线程中重写run方法,在run方法中初始化日期和时间格式,每秒钟获取一次日期字符串,然后调用线程类中CallBackMain对象的CallBackMain方法,将日期作为参数传递到MainActivity。
7、在MainActivity声明B类的对象,然后调用B的SetCallBack方法,参数中直接初始化CallBackMain对象,重写CallBacktoMain方法。
8、MainActivity中生命一个handler对象,重写handleMessage方法,在CallBacktoMain的回调函数中初始化bundle对象,将回调函数的参数写入bundle,初始化一个message对象,将bundle装入msg中,使用handler的sendMessage方法送到主线程,在handleMessage中使用TextView控件显示最新的日期。
更多最新安卓编程资料请关注微信公众号:安卓编程入门进阶
更多最新安卓编程资料请关注微信公众号:安卓编程入门进阶
百度云原清晰度地址:http://pan.baidu.com/s/1mhS0H8O
安卓回调函数的意义:
安卓中其实随处可见回调函数,用户在手机上执行的大部分操作都会产生一个回调事件,例如Button点击,listView的点击等。这些控件的回调函数都已经在安卓系统中内置写好,程序员使用上面的成熟控件只需要编写回调函数部分,即回调事件实际执行的部分。但是编写安卓程序不可避免的需要一些线程之类的特性。如上一节课程,如果线程是直接在MainActivity中初始化的,那么可以使用handler将数据传递到UI进程,但很明显,随着程序的功能增多,把所有的线程全部定义到MainActivity中很不现实。如果新建一个线程类,就需要解决线程类把结果实时通知到主线程并刷新UI的问题,安卓的回调机制就可以很好的解决此问题。回调的解释网上很多(如http://blog.csdn.net/wojiaotianyong/article/details/70948632),也有很多例程,本课程通过实际操作演示回调函数定义和创建的过程,程序通过创建子线程类,在子线程中每一秒读取一次系统时间,然后通过回调函数将数据传递到MainActivity中。
注意:虽然回调函数的函数体是在MainActivity.java中,但是这部分函数的执行还是属于子线程,如果要使用此数据刷新UI线程,还是需要使用handler(参见上一节课程)。
1、 创建一个空的工程,名为LearnCallback。
2、 在xml界面上添加一个button控件ID=btnStart用于启动子线程,再添加一个TextView控件ID=tvOut用于显示每秒产生的日期和时间输出。
3、 在MainActivity.java中为两个xml控件添加初始化。并设置button的监听事件。
4、 在包名上右键新建一个新的接口命名为CallBackMain,在类中添加一个CallbacktoMain方法参数为字符串类型用于传递字符串,结束。
5、在包名上右键新建一个新的类命名为B,继承自Thread类。声明一个CallBackMain对象,在类中添加一个SetCallback函数,参数为CallBackMain对象,函数体中将线程类中的CallBackMain对象指向传进来的参数。
6、在子线程中重写run方法,在run方法中初始化日期和时间格式,每秒钟获取一次日期字符串,然后调用线程类中CallBackMain对象的CallBackMain方法,将日期作为参数传递到MainActivity。
7、在MainActivity声明B类的对象,然后调用B的SetCallBack方法,参数中直接初始化CallBackMain对象,重写CallBacktoMain方法。
8、MainActivity中生命一个handler对象,重写handleMessage方法,在CallBacktoMain的回调函数中初始化bundle对象,将回调函数的参数写入bundle,初始化一个message对象,将bundle装入msg中,使用handler的sendMessage方法送到主线程,在handleMessage中使用TextView控件显示最新的日期。
更多最新安卓编程资料请关注微信公众号:安卓编程入门进阶
更多最新安卓编程资料请关注微信公众号:安卓编程入门进阶
相关文章推荐
- qtcpsocket调用write和read函数写数据乱码问题解决方法
- android调用系统相机和相册进行拍照裁剪处理,解决不同安卓版本存在无法加载相册的问题,处理了是否有sd卡的存在的情况
- HC-05与安卓通信数据丢失问题解决
- WindowsMobile(Winform)开发中的数据存储(解决在不同的Form中要调用对方的方法或者使用对方的数据问题)
- 为什么两次调用同一函数, 输入相同, 输出却不同呢? (解决困扰自己好几天的问题, 还是有点激动哈, 奖励自己一顿丰厚的晚餐)
- 同一个C语言工程不同C文件之间的函数互相调用问题(一)
- ViewController调用顺序问题,解决ViewController之间传递数据失败的问题
- 同一个C语言工程不同C文件之间的函数互相调用问题(二)
- 解决调用sql数据,显示英文时撑破tb的问题
- 解决C++中DrawItem()函数不被调用的问题
- 多个微服务在docker中运行,且互相调用,解决他们之间的connection问题
- 关于hadoop中datanode节点不同的dfs.data.dir之间数据均衡问题
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题 <转载>
- (转)jquery跨域调用webService,以及解决跨域情况下只能返回XMl格式数据的问题
- Hibernate 数据不同同步,重启Tomcat后才同步的问题解决
- 对接支付宝接口时,不使用SDK,调用成功但是返回的数据一直验签失败问题解决方案
- Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
- 解决kafka数据目录迁移后,flume无法正常调用Consumer的问题
- 解决kafka数据目录迁移后,flume无法正常调用Consumer的问题
- 解决kafka数据目录迁移后,flume无法正常调用Consumer的问题