Android开发学习之路-回调机制学习笔记

不知道是我学Java的时候没有认真听仍是怎么的,曾经一直不知道什么是“回调”,它有什么用,百度一大堆,都太复杂看不明白(好吧是我笨),因此想把本身理解的分享给其余看到的人,你们都真正认识一下这个重要的机制。html

若是你要进行Android开发,那么回调确定是会常常用到的,为何?下面慢慢来讲,大牛其实这个地方已经能够离开了......git

先从简单的开始,什么是回调?github

Java容许咱们调用接口的方法,可是有一个前提,就是编译的时候接口的对象必须是一个具体的类,而且这个类实现了接口。当咱们调用接口的方法的时候,接口的具体子类中的具体方法会被调用,这就是回调。嗯,我说什么鬼?仍是上代码吧。app

public interface A {
    void printClassName();
}
public class B implements A {
    public void printClassName() {
        System.out.println("This is class B!");
    }
}
public static void main(String[] args) {
        A a = new B();
        a.printClassName();
}

输出的结果以下:ide

从上面的代码能够看到,咱们在主函数中定义了接口A,也调用了接口A的方法,可是要注意,咱们实例化的时候其实new的是一个实现了A接口的具体类,咱们调用A中的printClassName方法的时候Java就会去回调B中的该方法。这样作的优势是什么?就是咱们在调用的时候,能够彻底无论A的子类是如何实现A中的方法的,只须要调用这个方法便可,怎么实现,咱们无论,那是子类的事情了,这样实际上是解耦的一种很好的方法,若是咱们要修改成别的类,只须要把new后面的子类改掉就好。函数

是否是很简单?若是代码你都懂,那么恭喜你,你已经距离成功只有一步之遥了。this

说回Androd,其实里面是有不少地方用到这个机制的,咱们也是从简单的提及。spa

不少时候,咱们对某个控件实现点击事件的监听,会像下面这样作:code

Button btn = new Button(this);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // doSth
    }
});

不少人都以为,这样很直接明了啊,但是若是我问你,为何咱们要new一个OnClickListener进去呢?若是你不知道,证实你还不彻底了解回调。按照咱们上面所说的,咱们能够调用接口的方法,可是接口须要一个具体的实现,因此咱们应该知道,setOnClickListener中的参数应该是一个接口,不信?咱们一块儿看看源码orm

public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
}

果真,接口中还有一个onClick方法。既然是回调,咱们再看看这个方法在哪里被调用了

先看setOnClickListener方法

public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
}

关键是把OnClickListener的对象赋值给了ListenerInfo的mOnClickListener,咱们再看下去

public boolean performClick() {
        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }

        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
        return result;
    }

咱们看到在这个叫作performClick的方法中调用了onClick方法,还有另一个叫作callOnClick的方法也会调用onClick,区别能够去看看源码的说明,这里不详细。那么这两个方法又在何时被执行的呢?其实他们都是在屏幕接收到点击信号的时候,把数据一层一层的往上传递给framework,由framework来调用。对于了解回调,我以为到这里就足够了,再往下就有点偏了。

要明白的一点就是,在这个类中,调用的是接口的方法。如今你应该明白了吧,为何咱们要new一个OnClickListener的子类呢?就是让编译器知道,调用接口方法的时候,去回调咱们设置的OnClickListener子类的对应方法。

若是到这里你都懂了,很好,咱们再说多一些,具体一些。

究竟咱们知道了这个机制以后,它有什么用呢?通常来讲,用得比较多,就是通讯以及MVP模式

通讯,其实就是不一样组件之间的通讯,能够是Fragment和Activity,也能够是Adapter和Activity,这里不详细说太多,能够看看以前的博文:http://www.cnblogs.com/Fndroid/p/5187444.html

上面咱们说到了MVP,这个模式真的很重要,对于比较大的项目来讲,意义很深远,既能帮助咱们解耦不堪重负的Activity,也能便于咱们维护和扩展,有兴趣能够参考下面这个项目:https://github.com/bboyfeiyu/the-tech-frontier-app

相关文章
相关标签/搜索