android开发之回调方法的一种设计
来源:互联网 发布:windows xp开机音乐 编辑:程序博客网 时间:2024/06/04 18:24
回调:If you call me,I will call you back! //如果你调用了我,我将会反过来调用你,这就是回调
回调在android编程中很常见,比如button的点击事件.
既然回调这么常见,那么回调有啥好处捏?为啥要这样设计?这才是我们需要关心的,编程的世界里,思想比实现显得更为重要.言归正传,回调实现了功能的定义和功能的实现相分离的设计实现,是一种松耦合的体现.
实质:持有实现类的引用,调用实现类实现的在接口中定义的方法就完成了接口的回调设计
一.1种回调的实现
1.下面这个类是功能的定义
package com.skythinking.callback;import java.util.HashMap;import java.util.Map;/** * * @author skythinking * @return * 回调的好处:父类可以调用子类的方法处理逻辑,而作为父类,不用关心子类如何实现,android框架中就用了好多回调,比如Activity的onCreate * ()等方法就是回调的运用 * */public class Parent {// 2.定义一个接口类的实现类引用CallBackInterface callBackInterface;// 1.定义一个接口类public interface CallBackInterface {// 在调用CallBack()方法之前调用的方法public void beforeCallBack();// 回调方法public void callBack(Map<String, String> map); // 父类可以传递给子类处理,可以返回处理结果,也可以不返回结果,这个看自己的需求}// 3.利用构造器拿到接口类的实现类引用public Parent(CallBackInterface callBackInterface) {this.callBackInterface = callBackInterface;}public void start() {Map<String, String> map = new HashMap<String, String>();map.put("name", "skythinking");// .beforeCllBack(),.callBack(map)方法相当于 I will call you backcallBackInterface.beforeCallBack();callBackInterface.callBack(map);}}
package com.skythinking.callback;import java.util.Map;import com.skythinking.callback.Parent.CallBackInterface;public class Son {public static void callParent() {new Parent(new CallBackInterface() {@Overridepublic void callBack(Map<String, String> map) {// 实现在父类中定义的接口类中未实现的方法System.out.println("拿到父类中传递过来的map" + map);// 接下来写自己的逻辑代码,Parent类中能调用自己接下来的的逻辑// ...业务逻辑}@Overridepublic void beforeCallBack() {// 实现在父类中定义的接口类中未实现的方法// 接下来写自己的逻辑代码,Parent类中能调用自己接下来的的逻辑// ...业务逻辑}}).start(); // .start()方法相当于If you call me}// 测试方法public static void main(String[] args) {callParent();}}
3.测试结果
拿到父类中传递过来的map{name=skythinking}
4.另外一种实现回调的方式,可以参考:http://blog.csdn.net/aigestudio/article/details/40869893
二.有了上面的思想,我们就可以模仿实现android的点击事件了
实质:持有实现类的引用,调用实现类实现的在接口中定义的方法就完成了接口的回调设计
1.定义一个点击事件的接口
- //这个是View的一个回调接口
- /**
- * Interface definition for a callback to be invoked when a view is clicked.
- */
- public interface OnClickListener {
- /**
- * Called when a view has been clicked.
- *
- * @param v The view that was clicked.
- */
- void onClick(View v);
- }
2.在Activity中实现这个接口,实现接口当然也就需要实现OnClickListener接口中定义的onClick(View v)方法
- package com.example.demo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- /**
- *
- * 实现 OnClickListener接口
- */
- public class MainActivity extends Activity implements OnClickListener{
- private Button button;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button1);
- /**
- * button注册点击事件,即通过该方法,把该实现类的引用赋值给
- */
- button.setOnClickListener(this);
- }
- /**
- * 用户点击Button时调用的回调函数,
- * 可以做任何你想做的事
- */
- @Override
- public void onClick(View v) {
- //想做的事
- }
- }
3.在View类中通过setOnClickListener(OnClickListener l)拿到实现类的引用,然后就可以调用实现类的onClick(View v)方法了
- public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
- /**
- * Listener used to dispatch click events.
- * This field should be made private, so it is hidden from the SDK.
- * {@hide}
- */
- protected OnClickListener mOnClickListener;
- /**
- * 通过setOnClickListener(OnClickListener l)来拿到实现类的引用
- * Register a callback to be invoked when this view is clicked. If this view is not
- * clickable, it becomes clickable.
- *
- * @param l The callback that will run
- *
- * @see #setClickable(boolean)
- */
- public void setOnClickListener(OnClickListener l) {
- if (!isClickable()) {
- setClickable(true);
- }
- mOnClickListener = l;
- }
- /**
- * Call this view's OnClickListener, if it is defined.
- *
- * @return True there was an assigned OnClickListener that was called, false
- * otherwise is returned.
- */
- public boolean performClick() {
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
- if (mOnClickListener != null) {
- playSoundEffect(SoundEffectConstants.CLICK);
- //拿到实现类的引用(mOnClickListener)就可以调用实现类的onClick(View v)方法了,并且把View类的引用传递给了实现类
- mOnClickListener.onClick(this);
- return true;
- }
- return false;
- }
- }
0 0
- android开发之回调方法的一种设计
- Android开发之一种简单的异步加载图片方法
- Windows下Android开发环境配置的一种方法
- Android开发获取本地图片的一种方法
- Android之退出整个应用的一种方法
- Android之退出整个应用的一种方法
- Android之退出整个应用的一种方法(二)
- 游戏设计架构的一种方法
- 一种新的Web设计方法
- 设计高效SQL: 一种视觉的方法
- 驱动接口API设计的一种方法
- 分析与设计的一种方法
- 一种报表输出的设计方法
- DLL开发及调用的一种方法
- 一种软件开发的方法【原创】
- 开发DSP硬件驱动程序的一种方法
- 开发DSP硬件驱动程序的一种方法
- 一种使用JDK开发WebService的方法
- HDU2059 龟兔赛跑 【DP】
- 事物
- 百度钱包新用户体验,送10元现金
- 第9周 项目2 分数的累加
- UML学习(二)-----类图
- android开发之回调方法的一种设计
- windows进程间通信
- C语言第七天
- 日语学习之沪江整理 20141024
- 应用程序内存分配
- Linux C编程(含C陷阱与缺陷笔记)
- Java小知识点学习--------数组和位运算小知识点
- 利用循环求和
- 智能可视化门铃方案调研报告