android中的回调简单认识

Posted 佩喻幻的Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中的回调简单认识相关的知识,希望对你有一定的参考价值。

 

首先说一下最抽象的形式——2个类,A类和B类。A类含有1个接口、1个接口变量、(可能含有)1个为接口变量赋值的方法以及1个会使用接口变量的“地方”;B类实现A中的接口,(可能)含有1个A类实例的引用,并且(可能用A类中为接口变量赋值的方法)将“自己”传递给A类的接口变量。

 

再将一个小故事:

我们平时考试答题的第一件事是干嘛?没错,是写上学号和姓名。这里注意了,我们填写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统将来调用),这其实就是一个回调的应用。老师提供接口(输入姓名,学号规则),我们利用接口注册。
看到上面的小故事,大家对回调就有了一些了解了,我们再回到开头的那个小故事。
那个故事说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范
 

首先是A类

public class A{
    ...
    //1个接口变量
    private Callback mCallback;
    ...

    //1个接口
    public interface Callback{
        void doSomething();
    }
    ...

    //1个给接口变量赋值的方法
    public void setCallback(Callback callback){
        mCallback = callback;
    }
    ...

    //1个使用接口变量的地方
    public void onExecute(){
        ...
        mCallback.doSomething();
        ...
    }
    ...
}

 

然后是B类

public class B implements A.Callback{
    ...
    //A类的实例的引用
    private A mAInstance;
    ...

    //B类实现了A类的接口
    public void doSomething(){
        Log.d("TAG","will do something");
    }
    ...
    //B类将自己(实际上是接口的实现)传给A类实例的接口变量
    mAInstance.setCallback(this);       
}

 

下的几个点:

  • A类中有一个接口变量和接口。
  • B类实现A类的接口(这个接口就是所谓的回调接口)。
  • A类的接口变量会(通过过某种方法)获得靠B类实现的接口。
  • A类在一个适当的时机“使用”这个接口变量,即调用接口中的函数(这个函数就是所谓的回调函数)。

用生活中的事情打比方,其实很像是某人甲买杀手去杀死仇人= =,甲只是告诉杀手杀人这个目的,具体怎么杀死甲的仇人,由杀手去决定。这里甲是A类,杀手是B类,甲在某时刻告诉杀手杀人是A类调用回调接口里面的回调函数,杀手杀人的方法是B类实现A类的回调接口…

C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供。S并不知道C提供的b是什么,因此S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数(即注册)。r为注册函数。

简单来说:

回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机

详细的描述:

 

 

  

 
类似的小故事:
我们平时考试答题的第一件事是干嘛?没错,是写上学号和姓名。这里注意了,我们填写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统将来调用),这其实就是一个回调的应用。老师提供接口(输入姓名,学号规则),我们利用接口注册。
看到上面的小故事,大家对回调就有了一些了解了,我们再回到开头的那个小故事。
那个故事说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
 
 
好的,我们已经大概知道了回调的基本流程,下面,来看看android中回调的基本使用。
Button button = (Button)this.findViewById(R.id.button);  
button.setOnClickListener(newButton.OnClickListener() {  
  
//回调函数  
@override  
publicvoidonClick(View v) {  
buttonTextView.setText("按钮被点击了");  
}  
});  

上面的代码给按钮加了一个事件监听器,这其实就是“回调”最常见的应用场景之一。我们自己不会显式地去调用onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。

 
 
 
参考自:http://blog.csdn.net/lindir/article/details/7819720,http://blog.csdn.net/chengkun_123/article/details/51318379

以上是关于android中的回调简单认识的主要内容,如果未能解决你的问题,请参考以下文章

Android片段文档含义

片段中的TextView在Android Studio中返回Null

如何从活动中传递回调到片段

通过按下 Android Studio 中的片段中的按钮进入新页面

当活动被破坏但我必须继续执行片段中的代码时该怎么办?

如何从 Android 中的 Fragment 访问 UI 元素?