Android回调机制思考与探讨

Android回调机制思考与探讨
初来乍到,刚接触Android开发不久,对Android的回调机制也是曾思考多次,终究没有明白其中的原理。正好最近也在接手一个项目,虽说不用回调机制做,可以实现,但是代码量还有效率问题是不能满足的。知道今天再思考到底回调机制是怎么一会事儿的时候,正好看见了另一篇博主的文章Android开发学习之路-回调机制学习笔记,于是乎觉得略有所悟,今特写出来,还希望各路大神能指点一二。
可能是理科生的原因吧,不喜欢说太多的废话,下面就直接列出关于“回调机制”我的一些看法,有问题的地方还望各位高手们多多指教。
1、编译时候,接口的对象必须是一个具体的类
2、回调本质是调接口中的方法,也就是调用接口对象中的方法
3、A要调用B中的某一个方法M()时,B先实现A中一个接口,并在接口的对象的某一个方法N()中调用方法M()的机制称之为“回调机制”
【注解:】Class A(如:Class A{ method (){} interface history { void select ()}})要调用Class B中的某一个方法[如:Class B{popWindow()}]时,B需要先实现A中一个接口[如:interface history{ void select()}],并在接口对象中的某一个方法中调用方法(如:popWindow())的过程称之为“回调”
4、回调机制,即触发机制,触发与响应触发机制。触发与响应触发之间使用“接口”联系。
4.1、触发点所在的类定义接口,并定义接口变量,以及set接口变量方法,并传入该接口变量参数,但并不实现接口;
eg:
package com.testdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
/***
* 触发点所在的类
*/
public class A extends AppCompatActivity {
private History history;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
}
public interface History{
void select();
}
public void setHistory(History history) {
this.history = history;
}
}

4.2、响应触发点所在的类,实现接口,并在实现的接口的对象的方法中执行与触发点有联系的方法。
eg:
package com.testdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
/***
* 响应触发点所在的类
*/
public class B extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
}
}
实现接口的形式有三种:
a、在响应触发点所在类的类名后通过implements 关键字实现接口,重写接口中的方法,并在
方法中调用需要执行的代码块;
eg:
package com.testdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle
/***
* 响应触发点所在的类
*/
public class B extends AppCompatActivity implements A.History {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
}

@Override
public void select() {
//TODO 执行需要的操作
}
}

b、在响应触发点所在的类中,通过new来实例化一个接口,重写接口中的方法,并在方法中
调用需要执行的代码块,再调用触发点所在的类的set接口变量()方法,并把前者实例
化的接口对象作为参数传入;
eg:
package com.testdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
/***
* 响应触发点所在的类
*/
public class B extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
A.History history = new A.History() {
@Override
public void select() {
//TODO 执行需要的代码块
}
};
//实例化一个A,通过A的对象调用其中的方法
A a = new A();
a.setHistory(history );
}
}
c、在响应触发点所在的类中,直接调用触发点所在的类的set接口变量()方法,在参数位置
直接new出接口的对象,并在接口重写的方法中调用需要执行的代码块;
eg:
package com.testdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
/***
* 响应触发点所在的类
*/
public class B extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
//实例化一个A的对象,通过对象调用其中的方法
A a = new A();
a.setHistory(new A.History() {
@Override
public void select() {
//TODO 执行需要的代码块
}
});
}
}


三种方式,中后两者其实原理基本一致,只不过b是先实例化一个接口对象,在作为参数传入,c是
直接在传参数的位置实例化接口对象;
5、所谓回调,就是A要调用B的某一个方法是,先调用了B自己的某一个方法,然后在调A中的需要调用的方法;其中所用到的接口,只是一个桥梁。
6、触发点所在类定义接口变量,注意,只是定义一个接口类型的变量,并添加该接口变量的set方法;而接口本身的定义可以在其他地方。
7、使用回调步骤:
7.1、确定谁是触发点,谁是触发响应点
7.2、定义一个接口,任何地方都可以,只要可以引用到就行,不一定非要在触发点所在的类中’
7.3、触发点所在类声明一个接口类型的变量,添加该接口变量的set方法;
7.4、触发响应点所在类调用触发点所在的类的set接口变量方法,并在参数位置new出接口对象,
此时会重写接口的方法。注意,这里是“触发响应点所在类调用触发点所在的类的set接口变量
方法”,至于怎么调用,可以自己决定,比如new对象调,或者给方法前面家static然后再类名
调用(后者没有尝试过!)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值