回调在Java中运用的相当广泛,类似Android中的控件点击监听事件(setOnClickListener()方法)就是典型的回调。回调是什么?关于回调的定义通俗地说就是:A类调用B类中的某个方法,然后B类中反过来调用A类中的方法D,D这个方法就叫做回调方法。在Java中回调的这个方法D一般是接口中定义,然后A类通过实现接口的D方法。

       一般回调的话需要满足以下几个条件:

  • Class A实现接口CallBack callback ——场景1
  • class A中包含一个class B的引用b ——场景2
  • class B有一个参数为callback的方法f(CallBack callback) ——场景3
  • A里的B的引用调用B的方法 f(CallBack callback) ——A类调用B类的某个方法C ——场景4
  • 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D ——场景5

接下来我将通过一个demo说明,假设我需要实现一个类似下载完成的监听方法。具体就是Download这个类可以实现下载,给它的构造方法中传入我们需要下载的数据量,其开始下载,并且提供了下载完成的监听,当下载成功或者失败后调用对应的回调方法。


首先,定义一个下载完成的接口,接口中包含了下载完成后的两个回调方法。


/**
 * 下载完成的回调接口
 * Created by zhangyongming on 2016/12/12.
 */
public interface OnDownloadCompleted {
    /**
     * 下载成功的回调
     */
    void onSuccess();

    /**
     * 下载失败的回调
     */
    void onFail();
}



然后是Download类:Download类有一个setOnDownloadCompletedListener(OnDownloadCompleted onDownloadCompleted)方法(相当于场景3),在该方法中模拟了下载过程,并且根据下载的结果调用了Test类的onSucess()跟onFail()方法(相当于场景5,这两个方法是Test类实现了OnDownloadCompleted接口后实现的方法),在这里我们模拟如果下载结果为100则为下载成功,否则下载失败。

/**
 * 模拟下载的类,里面有一个设置下载完成的监听
 * Created by zhangyongming on 2016/12/12.
 */
public class Download {
    private int progress;

    public Download(int progress) {
        this.progress = progress;
    }

    // class B有一个参数为callback的方法f(CallBack callback) ——场景3
    public void setOnDownloadCompletedListener(OnDownloadCompleted onDownloadCompleted) {
        for (int i = 0; i <= progress; i++) {
            System.out.println("下载进度: " + i + "%");
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D ——场景5
        if (progress == 100) {
            onDownloadCompleted.onSuccess();
        } else {
            onDownloadCompleted.onFail();
        }
    }
}




然后是Test类方法:Test类实现了OnDownloadCompleted接口,实现了onSuccess()方法跟onFail()方法(场景1);Test类包含了Download类的引用(场景2),Download的实例调用了setOnDownloadCompletedListener()方法(场景4)。

/**
 * Class A实现接口CallBack callback ——场景1
 * Created by zhangyongming on 2016/12/12.
 */
public class Test implements OnDownloadCompleted {
    public static void main(String[] args) {
        // class A中包含一个class B的引用b ——场景2
        Download download = new Download(20);
        // A里的B的引用调用B的方法 f(CallBack callback) ——A类调用B类的某个方法C ——场景4
        download.setOnDownloadCompletedListener(new Test());
    }

    @Override
    public void onSuccess() {
        System.out.println("┏━━━━━┳━━━━━┓");
        System.out.println("┃     ┃     ┃");
        System.out.println("┃           ┃");
        System.out.println("┣━ 下载完成 ━┫");
        System.out.println("┃           ┃");
        System.out.println("┃     ┃     ┃");
        System.out.println("┗━━━━━┻━━━━━┛");
    }

    @Override
    public void onFail() {
        System.out.println("┏ ━ ━ ┳ ━ ━ ┓");
        System.out.println("             ");
        System.out.println("┃           ┃");
        System.out.println("   下载失败   ");
        System.out.println("┃           ┃");
        System.out.println("             ");
        System.out.println("┗ ━ ━ ┻ ━ ━ ┛");
    }
}


上述demo我们输入一个int值之后,变开始进行循环,模拟下载过程,然后根据下载结果调用相应的方法展示数据。输出结果如下:

java中回滚什么意思 java回调是什么意思_System