接口回调本质就这么简单

原创 2016年05月31日 16:10:26

一、为什么会有接口回调?什么是接口回调?

其实这两个问题是一个问题,知道了接口回调的原理自然就知道了为什么会有这么个东西。我们知道java中接口是不可以直接创建实例的,那么问题来了,假如我把一个接口声明为一个变量,那么我执行这个接口中的方法,接口没有实例它该怎么办呢?啊哈,这里自然又改出现java中的另一个特性---“多态”,这时java虚拟机自然会去找其子类,调用其子类中已经重载的该方法,这里就是接口回调的本质!!我们只需要给该变量指向其子类的地址就可以在调用的时候知道调用子类的方法。那么我们就可以在A类中创建接口的子类实例,在B类中创建一个接口的变量,把A类的地址传给B类的变量,在变量执行接口中的方法的时候就会调用A类中重写的方法,这就是接口回调的执行步骤。我们在网络请求等耗时的操作的时候会使用到该机制,用来把得到的数据传回主线程中。

二、使用实例

下面我们就来用一个网络请求的实例来演示如何使用该机制,为了尽量的减少代码,使主要代码能够突出,里面的一些不必要的容错代码就没有写了,大家在正式的项目中希望可以做好容错处理。

我们用一个按钮和一个imageView来演示,当点击按钮的时候去下载数据,在数据下载完成之后使用接口回调把数据传回来显示在imageview中。效果如下:


布局文件很简单就不在贴出来了,我们有3个类,一个是回调的接口,一个是主activity,一个为执行下载并且把数据回调回来的Callee类,下面来看接口类:

import android.graphics.Bitmap;

/**
 * Created by JimLv on 2016/5/31.
 */
public interface CallBackInterface {
    void result(Bitmap bm);
}

定义了一个用于传递数据的方法,来看看Callee类:

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by JimLv on 2016/5/31.
 */
public class Callee {
    private final String IMGURL = "http://f.hiphotos.baidu.com/zhidao/pic/item/b21bb051f8198618a323ac464bed2e738ad4e688.jpg";
    //持有接口变量
    CallBackInterface mInterface;

    Callee(CallBackInterface theInterface) {
        //这里是关键,把外部的接口实例引用到该类,给变量赋值
        mInterface = theInterface;
        //创建对象的时候执行下载
        executeDown();
    }

    public void executeDown() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpURLConnection conn = (HttpURLConnection) new URL(IMGURL).openConnection();
                    conn.setConnectTimeout(5 * 1000);
                    conn.setRequestMethod("GET");
                    mInterface.result(BitmapFactory.decodeStream(conn.getInputStream()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
在这里我们声明了一个接口变量,在类的初始化方法中把接口的子类的地址赋给该变量并且调用下载数据的方法,在数据下载完成之后调用接口变量的方法把数据传给该方法,执行该方法实际是执行子类的该方法,这就是接口回调真正做的事。
最后我们来看MainActivity类:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ImageView imgv;
    private Button downImgBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imgv = (ImageView) findViewById(R.id.imgv);
        downImgBtn = (Button) findViewById(R.id.downImgBtn);
        //点击按钮去下载
        downImgBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        //从接口回调得到数据,因为下载是在子线程中,所以这里要变到主线程中设置图片
        new Callee(new CallBackInterface() {
            @Override
            public void result(final Bitmap bm) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        imgv.setImageBitmap(bm);
                    }
                });
            }
        });
    }
}

在这里我们用匿名内部类创建该接口的子类实例,子类重载的方法中因为是运行在子线程中的,我们无法操作UI,所有调用了runOnUiThread方法,把数据更新到imageview中,整个的demo就这么点是不是很简单呢?

扫描关注我的微信公众号:


三、总结

哈哈,整个回调机制是不是很简单呢?其实以前不懂这个的时候也是很头疼,理不清里面的逻辑,百度上面的文章又是一大堆,可是里面内容啰啰嗦嗦不知所云,真是肯爹不浅啊。“”该死的程序狗“”~~~~~~~~~~好啦,其实我也很讨厌别人这么说,不过无所谓啦,我们是有上进心的工程师,不是和你家那位一样的程序狗!弄懂了一个技术的本质是什么之后使用起来才不会无从下手,遇到问题才会知道如何解决。如果你觉得这篇文章写的还不错希望你点个赞,如果想看我以后写的文章请关注我,祝步步高升,天天开心!
最后附上demo:点击打开链接

版权声明:本文为欢乐斗佛原创文章,未经其允许不得转载。

相关文章推荐

接口回调(重点是理解)

模板性代码: private MyListener myListener; public interface MyListener { //通过抽象方法的参数...

一个经典例子让你彻彻底底理解java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中...

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

接口回调简单理解就是:类A中调用B类的中方法C,而B又反过去调用A中的方法D,然后D称为A的回调方法。是不是心中有一万只草泥马在奔腾,到底说的是什么。感觉像是你中有我,我中有你,纠缠不清。 举个通俗易...

java 中的观察者模式实现之接口回调

在学习的过程过,多次见到回调接口的时候,有时候觉得自己会了,当要自己马上写一个回调的实际例子出来还是感到挺吃力的,所以在此写一篇博客,记录一下自己对回调的理解,免得自己忘了的时候没有参考。 1.首...
  • Reoger
  • Reoger
  • 2016年04月21日 23:01
  • 1160

对于接口回调的简单理解

接口回调在实际的应用中可以说是无处不在的,比方说你向服务器请求一个数据,请求结束的时候你需要在界面上进行一个显示,当然你可以选择一直等待,但是这样做效率实在是太低,并如果你在android 的Acti...

3秒钟不懂你砍我:接口回调

之所以用到接口回调,是不想把网络请求暴露在外面,算是没事找事,不过接口回调还是值得记录的,这里拿网络请求来举例更为清晰。 1.定义接口 public interface nikaixinjiuhao...

Java接口回调

Java接口回调1. 关于回调回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。软件模块之间总是存在着一定的接口,从...
  • zhliro
  • zhliro
  • 2015年07月14日 16:42
  • 1611

最简单的方式理解“接口回调”的设计

以前对接口回调总是那么的模糊,现在仔细的看看,也没有那么的复杂。  总结如下:        接口回调需要3个类文件实现:接口类,功能类,实现类 一、接口类        1、...

接口回调本质就这么简单

一、为什么会有接口回调?什么是接口回调? 其实这两个问题是一个问题,知道了接口回调的原理自然就知道了为什么会有这么个东西。我们知道java中接口是不可以直接创建实例的,那么问题来了,假如我把一个接口...
  • bfboys
  • bfboys
  • 2016年09月23日 17:26
  • 431

java为什么要使用接口回调

也许你在编程的过程中会发现这样一行代码:格式如: 接口 接口变量 = new 接口 子类();Link link = new ArrayList(); //Link为一个接口 ArrayLis...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接口回调本质就这么简单
举报原因:
原因补充:

(最多只允许输入30个字)