接口回调android监听器,通俗易懂的让你彻底明白接口回调机制

转载请注明出处:flowsky37的博客,尊重他人辛苦劳动!

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

举个通俗易懂的例子,比如顾客是A,厨师是B。面粉是接口Callback。然后面粉的吃法D是在顾客A的手中,师B有包子的做法C。现在需求是A想吃包子,但是A是不会做包子,就需要去找厨师,让他调方法C做包子,A就把面粉Callback给了厨师,至于厨师怎么做,A不管,A只要你做好了给我一个结果(包子)就OK了。至于包子怎么吃,我是直接吃,还是蘸点醋吃,那是A的事了(A怎么吃的过程就是方法D里具体执行的代码)。

下面结合一个简单的例子看就容易多了。

首先是定义接口(面粉):

package com.example.interfacecallbackdemo;

public interface Callback {

//因为是一堆面粉,肯定是没法吃的,所以没有具体的方法体,俗称“吃法”

public void D(String result);

}

然后定义A类(客户):

package com.example.interfacecallbackdemo;

public class A implements Callback{

/** * B类引用 */

private B b;

public A(B b) {

this.b = b;

}

/** * A类通过该方法调用B的方法C(可理解为找到厨师并将面粉给他)。 */

public void selectMenu(){

b.C(this);

}

/** * A类中的D方法,也称为A类的回调方法(厨师做好包子将包子(result)返回给顾客A) */

@Override

public void D(String result) {

System.out.print(result);

}

}

然后是B类:

package com.example.interfacecallbackdemo;

public class B {

/** * B类的C方法(接受面粉Callback,然后开工做包子,做好后返回给客户A)。 */

public void C(Callback callback){

String result = "2";

callback.D(result);

}

}

再加上一个执行的对象,我是利用android中button调用的:

package com.example.interfacecallbackdemo;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

private A a;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.btn_main)

.setOnClickListener(this);

a = new A(new B());

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_main:

a.selectMenu();

break;

default:

break;

}

}

}

(ABCD分别对应什么自己脑补,很easy吧)前面说的是A 调用B中的方法C,B又反过来调用A中的方法D。在代码中我就直接用ABCD ,简单、直接、粗暴。

但是,B类的C方法的参数不必一定要把Callback作为参数,如果C方法中没有这个参数,那在B类中一定要在其它地方把Callback接收进来。比如,我把B类稍微改动一下:

package com.example.interfacecallbackdemo;

public class B {

private Callback callback;

public B(Callback callback){

this.callback = callback;

}

/** * B类的C方法 */

public void C(){

String result = "2";

callback.D(result);

}

}

此时A类也要做相应的调整:

package com.example.interfacecallbackdemo;

import android.util.Log;

public class A {

/** * B类引用 */

private B b;

/** * A类同过该方法调用B类的C方法 */

public void selectMenu(){

b = new B(new Callback() {

@Override

public void D(String result) {

System.out.print(result);

}

});

b.C();

}

}

呃,这个算是标准版的变异版,其实也是很简单的,毕竟这种可能是大家项目中实际中会见到而不至于弄不清楚,但是有一点,C方法中一定会有接口的实例对象调用其抽象方法。其实我们不需要按接口回调的定义去对比,重要的是理解其原理机制,只需记住,哪个类传递Callback实例对象过去的,就是我们所说的A,接受的就是B。 接口回调在android中是非常常见的,典型的就是各种监听器了,如果去分析下源码,你就会发现跟上面得那个例子大同小异。 上面是个人对接口回调的一些理解,如果有不明白的,可以留言;如果某些地方有误,非常欢迎指出,谢谢!**

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值