Java回调是非常好用的一种手段,它可以用来传递数据并使代码有好的封装性。初学者可能对它不太了解,所以今天来看一下它的使用方法。

        使用回调,分三个步骤:
        1、创建回调接口ICallback,定义要回调的方法
        2、创建类B,获取由外部传入的回调接口实现callbackImpl,在需要的地方调用回调方法
        3、需要使用类B的类A,实现ICallback接口,根据类B的要求传入接口实现callbackImpl

        上面的过程,实际应用中其实是因为类B需要回调接口,所以创建ICallback,不要弄混了因果关系。我们来看一个实例:

        B是一个服务类,所有人都能使用B的服务。B提供帮你取外卖及取快递两个业务。

package com.ssw.callback;

public class B {

    private OnGetListener iCallBack;
    private boolean isRainning = true;
    private boolean isSnowwing = false;

    public static final int SEND_SUCCESS = 0;
    public static final int NO_SEND_RAIN = 1;
    public static final int NO_SEND_SNOW = 2;

    public B(OnGetListener iCallBack) {//步骤2:获取接口实现
        this.iCallBack = iCallBack;
    }

    public void getDelivery(String address){
        if (isRainning) {
            iCallBack.onGet(NO_SEND_RAIN);//调用接口方法
            return;
        }
        if (isSnowwing) {
            iCallBack.onGet(NO_SEND_RAIN);
            return;
        }
        iCallBack.onGet(SEND_SUCCESS);
        iCallBack.onPay(20);
    }

    void getFood(String name) {
        if (isRainning) {
            iCallBack.onGet(NO_SEND_RAIN);
            return;
        }
        if (isSnowwing) {
            iCallBack.onGet(NO_SEND_RAIN);
            return;
        }
        iCallBack.onGet(SEND_SUCCESS);
        iCallBack.onPay(30);
    }

    public interface OnGetListener {//步骤1:创建接口
        void onGet(int status);//当前送货状态
        int onPay(int money);//提醒客户需要付款
    }
}

        A是买家,会使用B来让它帮忙取外卖、取快递。

package com.ssw.callback;

import android.util.Log;

public class A {
    private B mB;

    public A() {
        mB = new B(mLisenter);//步骤3:传入接口实现
    }

    public void buyGoods() {
        mB.getDelivery("1号楼");
    }

    public void buyFood() {
        mB.getFood("2号楼");
    }

    B.OnGetListener mLisenter = new B.OnGetListener() {//接口实现,可以在内部实现,也可以直接用class A直接实现接口
        @Override
        public void onGet(int status) {//根据当前状态,进行不同操作
            if (status == B.NO_SEND_RAIN) {
                Log.d("A", "下雨天伤心,不拿了");
            } else if (status == B.NO_SEND_SNOW) {
                Log.d("A", "下雪了,出去玩");
            } else if (status == B.SEND_SUCCESS) {
                Log.d("A", "小哥送到了,去开门");
            }
        }

        @Override
        public int onPay(int money) {//去付钱
            Log.d("A", "I should pay " + money + " $");
            return 0;
        }
    };
}

        B中创建了回调接口和回调方法。A要使用B,就需要实现B中定义的接口。B在需要的时候如通知买家现在外卖的状态时,调用接口中的方法,用来通知买家,而买家根据B返回的状态进行不同的操作。

        根据讲解及例子,相信你已经对回调有了一定了解。想要更加熟练的使用它,就需要你接下来在实际项目中去锻炼了。回调在每个项目中都必不可少,以实际Android系统来说,最经典的View.setOnClickListener(OnClickListener())就是回调。还有其它非常多地方使用了回调,用来通知外界当前的状态和需要进行的操作。