zoukankan      html  css  js  c++  java
  • 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,

     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    
     6 
     7     public void OnClick(Button b);
     8 
     9  
    10 
    11 }
    12 
    13 2. 定义Button
    14 
    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        @Override
    50 
    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 }
  • 相关阅读:
    【码上微服务】- 环境搭建
    【码上微服务】- 环境搭建
    Python 3版本 开始
    算法理解之大数相乘问题
    mycat配置分库分表 读写分离 linux系统
    es6的数组去重
    解析Java为什么不接受合法的HTTPS证书
    为什么要创建开放源码的PlayScala社区?
    实时同步MongoDB Oplog开发指南
    Scala基础
  • 原文地址:https://www.cnblogs.com/Sunnor/p/4735000.html
Copyright © 2011-2022 走看看