通俗易懂的让你彻底明白接口回调机制

转载请注明出处:flowsky37的博客,尊重他人辛苦劳动!
接口回调简单理解就是:类A中调用B类的中方法C,而B又反过去调用A中的方法D,然后D称为A的回调方法。是不是心中有一万只草泥马在奔腾,到底说的是什么。感觉像是你中有我,我中有你,纠缠不清。
举个通俗易懂的例子,比如顾客是A,厨师是B。面粉是接口Callback。然后面粉的吃法D是在顾客A的手中,厨师B有包子的做法C。现在需求是A有面粉,想吃包子,但是A是不会做包子,就需要去找厨师,让他调方法C做包子,A就把面粉Callback给了厨师,至于厨师怎么做,A不管,A只要你做好了给我一个结果(包子)就OK了。至于包子怎么吃,我是直接吃,还是蘸点醋吃,那是A的事了(A怎么吃的过程就是方法D里具体执行的代码)。
下面结合一个简单的例子看就容易多了。
首先是定义接口(面粉):

package com.example.interfacecallbackdemo;
public interface Callback {
    //因为是一堆面粉,肯定是没法吃的,所以没有具体的方法体,俗称“吃法”
    public void D(String result);
}
然后定义A类(客户):
package com.example.interfacecallbackdemo;
public class A implements Callback{
    /**
     * B类引用
     */
    private B b;
    public A(B b) {
        this.b = b;
    }
    /**
     * A类通过该方法调用B的方法C(可理解为找到厨师并将面粉给他)。
     */
    public void selectMenu(){
        b.C(this);
    }
    /**
     * A类中的D方法,也称为A类的回调方法(厨师做好包子将包子(result)返回给顾客A)
     */
    @Override
    public void D(String result) {
        System.out.print(result);
    }

}
然后是B类:
package com.example.interfacecallbackdemo;
public class B {
    /**
     * B类的C方法(接受面粉Callback,然后开工做包子,做好后返回给客户A)。
     */
    public void C(Callback callback){
        String result = "2";
        callback.D(result);
    }
}
再加上一个执行的对象,我是利用android中button调用的:
package com.example.interfacecallbackdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
    private A a;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_main)
        .setOnClickListener(this);
        a = new A(new B());
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_main:
            a.selectMenu();
            break;
        default:
            break;
        }

    }
}

(ABCD分别对应什么自己脑补,很easy吧)前面说的是A 调用B中的方法C,B又反过来调用A中的方法D。在代码中我就直接用ABCD ,简单、直接、粗暴。
但是,B类的C方法的参数不必一定要把Callback作为参数,如果C方法中没有这个参数,那在B类中一定要在其它地方把Callback接收进来。比如,我把B类稍微改动一下:

package com.example.interfacecallbackdemo;
public class B {
    private Callback callback;

    public B(Callback callback){
        this.callback = callback;
    }
    /**
     * B类的C方法
     */
    public void C(){
        String result = "2";
        callback.D(result);
    }
}

此时A类也要做相应的调整:

package com.example.interfacecallbackdemo;
import android.util.Log;
public class A {
    /**
     * B类引用
     */
    private B b;

    /**
     * A类同过该方法调用B类的C方法
     */
    public void selectMenu(){
        b = new B(new Callback() {

            @Override
            public void D(String result) {
                System.out.print(result);               
            }
        });
        b.C();
    }
}

呃,这个算是标准版的变异版,其实也是很简单的,毕竟这种可能是大家项目中实际中会见到而不至于弄不清楚,但是有一点,C方法中一定会有接口的实例对象调用其抽象方法。其实我们不需要按接口回调的定义去对比,重要的是理解其原理机制,只需记住,哪个类传递Callback实例对象过去的,就是我们所说的A,接受的就是B。
接口回调在android中是非常常见的,典型的就是各种监听器了,如果去分析下源码,你就会发现跟上面得那个例子大同小异。
上面是个人对接口回调的一些理解,如果有不明白的,可以留言;如果某些地方有误,非常欢迎指出,谢谢!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值