android 异步回调机制

jopen 10年前

android事件处理:
基于监听,基于回调。
基于监听,是为android界面组件绑定特定的事件监听器。主要处理一些特定的事件。
基于回调,时重写android组件特定的回调方法,或者重写activity的回调方法。android为绝大部分界面组件都提供了事件响应的回调方法。可以用于处理一些具有通用性的事件。

对于基于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发生特定事件之后,该事件交给事件监听器负责处理,对于基于回调的事件处理模型来说,事件源和事件监听器时统一的,当时间源发生特定事件之后,该事件还是有事件源本身负责处理。
例如:boolean onKeyMultiple(int keyCode,int repeateCount,KeyEvent event)用于响应按键重复点击。官方API支出,它总是返回false,没有handle,必须重写才能实现。

委托机制需要事件源,事件和监听。而回调机制难以理解,网上通俗的说法是:A类持有B类引用,A调用B的方法C,然后B类中反过来调用A类中的方法D,D就叫回调方法。其实D正是回调接口中的方法。

根据这种思路的理解,我写了个简单的示例,方便自己了解。

A有一个策划方案,需要B去完成。B还有其他工作要做,只有做完了才能去做这个策划方案。B完成策划方案后,调用A的方法,把方案交给A。

A类:需要实现回调接口,并调用B的一个方法

    public class A implements CallBack{            /**             * A类持有B类的一个引用             */            private B b;            public A(B b){                this.b=b;            }            /**             * 执行异步任务的方法             * @param ask             */                        public void ask(final String ask){                //模拟异步任务,同时进行两项任务                new Thread(new Runnable() {                            @Override                    public void run() {                        //1   调用B类方法,完成获取方案                        b.excuteMessage(A.this, ask);                        //2   执行其他任务                        task();                    }                }).start();            }            /**             * 其他任务             */            public void task(){                System.out.println("---------");            }                    /**             * 得到解决方案             * 回调方法             */            @Override            public void sovle(String result) {                System.out.println(result);            }        }  
</div> </div>

B类:被调用的方法需要带有一个回调接口的参数,并调用A类的一个方法(回调方法)

    public class B {                    /**             * 接口做参数的方法             * @param cb 回调接口             * @param ask 问题             */            public void excuteMessage(CallBack cb,String ask){                System.out.println("问题是:"+ask);                //经过一段时间,方案已产生                String result = "方案1";                //B类中反过来调用A类中的方法                cb.sovle(result);            }        }  
</div> </div>
回调接口:
    /**         * 回调接口         * @author DB         *         */        public interface CallBack {                    /**             * 回调方法             * @param result             */            public void sovle(String result);        }  
</div> </div>
main:
public class Test {            public static void main(String[] args) {            B b = new B();//B类注册回调方法            A a = new A(b);//A类实现回调接口            //A类引用调用自身方法            a.ask("ask");        }    }  
</div> </div>