«

Android-->回调(interface/abstract)的用法(通俗易懂)

时间:2024-3-2 19:01     作者:韩俊     分类: Android


使用场景
小明想要问小红借10块钱,小红答应借. 但是小红很关心小明还钱,因为小红想要在小明还钱之后,去买好吃的蛋糕.
这个时候, 小红又不能时时刻刻催着小明还钱. 只能等小明还钱的时候通知小红了;
那么, 小明通知小红的这个过程, 我把它叫做 回调;

上代码(Interface部分):
1:首先定义个 还钱的回调接口

public interface OnRepay{
    boolean onRepay();
}

2:因为是小明还钱, 所以在小明(XiaoMing)类中,调用接口方法,进行还钱

//小明, 用来借钱的类, 同时也是调用回调函数的类
public class XiaoMing {
    OnRepay XiaoHong;// 小红

    public XiaoMing(OnRepay listener) {
        this.XiaoHong = listener;
    }

    // 小明借钱的方法
    public void JieQian() {
        Log.e("小明", "小明借了小红10块钱,小明说:"不要着急, 还钱的时候,我会告诉你."");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 过了一会儿, 小明要还钱了,这个时候要通知小红. 通知的方式,就用到了回调
        if (XiaoHong.onRepay()) {// 告诉小红, 小明还钱了;
            //如果小红收到小明还的10块钱;
            Log.e("小红", "谢谢的还钱,我已经收到");
        }else {
            //如果小红没有收到10块钱(可能路上被强盗抢了),那么....
            Log.e("小红", "小明还我的钱,我没有收到,可能被快递员私吞了, 请再还一次");
        }
    }
}

3:因为小红想要知道还钱的结果,所以小红需要实现这个接口方法

public class MainActivity extends Activity implements OnRepay {

    XiaoMing XiaoMing;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        XiaoMing = new XiaoMing(this);
    }

    @Override
    public boolean onRepay() {// 小明还钱的时候,小红接收, 返回true:收到了钱, 返回false:没收收到
        Log.e("小红", "小红没有收到小明的还钱,可能被快递员私吞了...");
        return false;
    }
}

4:OK,步骤完成了,就差启动 小明借钱了;

//这个方法放在MainActivity中
public void button1(View view) {
    XiaoMing.JieQian();
}

/**对应的Button声明
<Button
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:onClick="button1"
   android:text="Interface回调" />
*/

上代码(abstract部分):
1:声明借钱的过程(和interface类似)

public abstract class OnRepayCallback {
    abstract boolean onRepayCallBack();
}

2:实现小明的借钱方法

    public void JieQianCallback(OnRepayCallback callback){
        Log.e("小明", "小明借了小红10块钱,小明说:"不要着急, 还钱的时候,我会告诉你."");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 过了一会儿, 小明要还钱了,这个时候要通知小红. 通知的方式,就用到了回调
        if (callback.onRepayCallBack()) {// 告诉小红, 小明还钱了;
            //如果小红收到小明还的10块钱;
            Log.e("小红", "谢谢的还钱,我已经收到");
        }else {
            //如果小红没有收到10块钱(可能路上被强盗抢了),那么....
            Log.e("小红", "小明还我的钱,我没有收到,可能被快递员私吞了, 请再还一次");
        }
    }

3:小红借钱给小明,并且处理小明还钱的结果

public class MainActivity extends Activity implements OnRepay {

    XiaoMing XiaoMing;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        XiaoMing = new XiaoMing(this);
    }

    /**对应的Button声明
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:onClick="button2"
       android:text="Abstract回调" />
    */
    public void button2(View view) {
        XiaoMing.JieQianCallback(new OnRepayCallback() {

            @Override
            boolean onRepayCallBack() {
                Log.e("小红", "小红收到小明的还钱10元...");
                return true;
            }
        });
    }

}

总结一下:
Interface 和 Abstract, 目的都是实现回调, 选择的时候可以任意选一种, 你熟练就行;

区别:
Interface 定义的方法都不能有方法体,而 Abstract可以定义有方法体的方法;

源码demo下载: http://download.csdn.net/detail/angcyo/8783907

至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

标签: android

热门推荐