安卓中经常用到的回调机制的理解
安卓中经常用到的回调机制的理解
定义
现有接口A和普通类B,其中B实现了接口A,则使用普通类B创建的对象b可以赋值给接口A创建的对象。此时,b作为接口变量可以调用B中的方法。
实际上,当接口变量调用实现类的方法时,就是通知相应的对象去调用接口的方法,这一过程称为对象功能的接口回调。
public class B implements A{
public void fun() {
System.out.println("这是A的实现类B的void方法");
}
public static void main(String[] args) {
B b = new B();
A a;
a = b;
a.fun();
}
}
再以员工与老板举例:老板是接口,员工是实现接口的类。
public interface Boss {
void build(String think);
}
方法build()表示老板给员工一个修建的任务,参数think表示老板提出了自己的大致想法,至于具体实现呢,当然是要靠员工了!在哪里实现呢,当然是在我们的员工类里,以MainActivity为例。
class Employer implements Boss{
private static final String TAG = "MainActivity" ;
@Override
public void build(String think) {
Log.d(TAG,think);
}
}
员工类继承了老板类,即员工接受了老板的想法,并具体的去实现。
public class MainActivity extends AppCompatActivity {
private Boss person = new Employer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
person.build("盖一座12层的楼房!");
}
输出:
D/MainActivity:盖一座12层的楼房!
以下是完整的MainActivity代码:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Boss person = new Employer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
person.build("盖一座12层的楼房!");
}
}
class Employer implements Boss{
private static final String TAG = "MainActivity" ;
@Override
public void build(String think) {
Log.d(TAG,think);
}
}
升级难度,结合Android
Step1: 定义一个回调接口(非Activity中)
// 接口
public interface CallBack{
// 定义了一个获取信息的函数
public void getResult(String result);
}
Step2:接口回调(非Activity中)
// 接口回调
public void getData(CallBack callBack){
String msg = editText.getText().toString();
callBack.getResult(msg);
}
Step3:使用接口回调方法读数据(Activity中)
// 使用接口回调的方法获取数据
leftFragment.getData(new CallBack(){
@Override
public void getResult(String result){
Toast.makeText(MainActivity.this, "--->>>"+result, 1).show();
}
});
下图是我对上述代码的执行流程和java机制的一些梳理:
首先,我们声明了一个接口,这时不用怎么管这个接口,就把它当作空气。
接着我们看第三步,它调用了第二步中的一个方法getData(),需要传递一个参数,这是一个接口对象;
所以我们就new了一个对象,而这个对象的实现又有点特殊,因为我们需要实现这个接口里的方法:getResult()
在new 对象的时候,并非就直接执行了里边的方法,而只是简单的传递了对象而已,而这个对象被传递到了第二步中的方法时,有一个步骤很关键:callback.getResult(msg);当执行到这一步时才会回去调用(我想这就是回调吧,回去调用
总结
接口为我们提供了方法,然而方法的具体实现确是在我们自己写的实现类里面。当我们调用了实现类中声明了接口对象并调用其方法时,就相当于调用了我们自己实现的方法。接口是功能的实现,而继承是本质的延续。