接口回调本质就这么简单

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

其实这两个问题是一个问题,知道了接口回调的原理自然就知道了为什么会有这么个东西。我们知道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:点击打开链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,550评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,573评论 18 139
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 1,142评论 1 0
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,564评论 1 114
  • ·不惧风浪·
    休普阅读 151评论 0 2