安卓中经常用到的回调机制的理解

安卓中经常用到的回调机制的理解

定义

现有接口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机制的一些梳理:

http://47.98.120.125/wp-content/uploads/2020/05/Android%E5%9B%9E%E8%B0%83%E6%9C%BA%E5%88%B6%E7%9A%84%E7%90%86%E8%A7%A3.png

首先,我们声明了一个接口,这时不用怎么管这个接口,就把它当作空气。

接着我们看第三步,它调用了第二步中的一个方法getData(),需要传递一个参数,这是一个接口对象;

所以我们就new了一个对象,而这个对象的实现又有点特殊,因为我们需要实现这个接口里的方法:getResult()

在new 对象的时候,并非就直接执行了里边的方法,而只是简单的传递了对象而已,而这个对象被传递到了第二步中的方法时,有一个步骤很关键:callback.getResult(msg);当执行到这一步时才会回去调用(我想这就是回调吧,回去调用)我们实现的接口方法getResult()。而这时我们的方法里的参数result也就有了.我们也就在另一个类里获得了数值。

总结

接口为我们提供了方法,然而方法的具体实现确是在我们自己写的实现类里面。当我们调用了实现类中声明了接口对象并调用其方法时,就相当于调用了我们自己实现的方法。接口是功能的实现,而继承是本质的延续。

posted @ 2020-11-15 09:53  jungu  阅读(184)  评论(0)    收藏  举报