一个例子让你彻底理解java接口回调

说到接口回调,对于初学者来说,理解是真的难啊,不过没有关系,看完本篇文章,你马上就能理解接口回调啦!

概念

什么是接口回调?用我的理解,就是:A让B去做一件耗时的操作,而且并不知道要花费多少时间,B做完了后,告诉A事情做完了,并且把结果给A。当然,B在做这件事的时候,A还可以做其他事情

用途

假设有一个耗时的操作:在网上下载一张图片,我们并不知道下载这张图片具体要花费多少时间,于是我们开一个线程去下载图片,当该线程下载完图片后,把图片给需要的人。

用法

既然是接口回调,那就少不了接口啦:

public interface CallBack {
    void callBack(String picture);
}

这里我们定义了一个接口,并且设置了一个方法,方法里的参数就是B执行完后返回给A的结果。

那么这个接口该怎么用呢?

这里我们假设一个场景:A需要在网上下载一张图片,但是A并不知道下载这张图片需要多少时间,于是A开了一个线程B去下载这张图片,并且B下载完后将图片给A。

这个B线程我们应该怎么写?

public class MyThread extends Thread{

    private CallBack callBack;

    public MyThread(CallBack callBack) {
        this.callBack = callBack;
    }

    @Override
    public void run() {
        super.run();

        // 模仿耗时操作
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(500);
                System.out.println("图片下载中。。。(假装耗时)");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        callBack.callBack("得的图片!!!");

    }

}

接下来我来解释下怎么理解这个线程中的接口。
我们在线程中声明了一个接口,主要是为了在耗时操作完成后,使用这个接口中的那个callBack(String picture)方法。将结果丢到这个方法的参数中。

但是卧槽!这不就是一个接口吗,方法体在哪里,就算把结果传给了这个方法里面又有什么卵用??
我的结果呢?哪去了!!!

带着这些疑问,我们开始使用这个构造方法含有接口的线程。

使用:

    MyThread myThread = new MyThread(new CallBack() {

            @Override
            public void callBack(String picture) {
                System.out.println(picture);
            }
        });

    myThread.start();

我们发现在使用这个线程的时候,需要在构造方法中传递一个已经实现了该接口的类,匿名类走起。
然后会在这个匿名类中生成一个方法,原来方法体在这里,我们发现这个方法还有可以利用的参数,没错!这个参数就是经过耗时操作返回给我们的结果,也就是那张图片!!
赶快运行一波!!!

运行结果:

图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
得的图片!!!

这么简单易懂的代码真是骚的飞起!

这就是我对接口回调的理解及使用方法,希望你们看了这篇后再也不会为接口回调而烦恼!

源码下载:http://download.csdn.net/detail/it_xf/9790588

猜你喜欢

转载自blog.csdn.net/it_xf/article/details/65058367