android中的Handler和Callback机制

来源:互联网 发布:苹果接电话变声软件 编辑:程序博客网 时间:2024/05/20 09:44

Handler是android中的一种异步机制,主要通过消息机制实现.
1,发消息
如sendMessage(Message msg)
2,处理消息
如handleMessage(Message msg)
3,哪个Handler能够处理消息
msg的Target确定了哪个Handler能够处理,
Message里面有两个方法
Handler getTarget()
getTarget方法获取到当前消息的Target,这个Target可以处理消息;
setTarget(Handler target)
setTarget方法设置一个能够处理这个消息的Handler,显然此时可以自定义一个Handler
4,使用Handler和Callback调用方法
使用场景:class A 调用class B.c(String)方法,在A中不能直接new B的时候

class A{    public void A_call_B_c(String str){//A调用B的c(String)方法        Call_Listener call_Listener_old = new Call_Listener() {            @Override            public void cCallback(Map<String, Object> callBackMap) {                //处理B.c(String)返回的结果数据            }        };        Handler.Callback instance=createB_instance();//创建B的对象,不能直接new B        //比如采用动态加载方式创建B的对象        Map<String, Object> map= new HashMap<String, Object>();        map.put(ABConstd.ataParam_1, str);        map.put(ABConst.dataCall_Listener_old, call_Listener_old);        map.put(ABConst.dataClass_Instance, instance);        SDKCall.startRoot(map);        Acall.callBc(map);    }    private Handler.Callback createB_instance(){        return (Handler.Callback)createB_by_DexClassLoader();        //createB_by_DexClassLoader()中使用动态加载方式创建一个B的实例,        //采用DexClassLoader加载一个jar,或者dex,或者apk中的B.class        //请参考DexClassLoader实现createB_by_DexClassLoader()    }}class Acall{    public static callBc(Map<String, Object> callMap){        Message callMsg = new Message();        callMsg .what = ABConst.Call_Msg;        callMsg .obj = callMap;        callMsg.setTarget(new Handler() {            @Override            public void handleMessage(Message callBackMsg) {                if (ABConst.Call_Back_Msg == callBackMsg.what) {                }            }        }        Handler.Callback instance = (Callback) callMap            .get(ABConst.dataClass_Instance);        instance.handleMessage(callMsg );    }}public class A_B_Callbcak implements Handler.Callback {    @Override    public boolean handleMessage(Message msg) {        return BCall.handleMessage(this, msg);    }    public void c(final Map<String, Object> map) {    }}class B extends A_B_Callbcak{    public void c(final Map<String, Object> map) {        //取出参数,使用map数据完成方法的逻辑        String one=map.get(ABConst.dataParam_1);        othersLogic();        //处理完毕,给A返回处理结果        Call_Listener call_Listener_new=(Call_Listener)        map.get(ABConst.dataCall_Listener_new);        Map<String, Object> callBackMap=new HashMap<String, Object>();        callBackMap.put(ABConst.dataResult, "B.c()返回的结果");        call_Listener_new.cCallback(callBackMap);    }}class Bcall {    public static boolean handleMessage(Callback callbcak, Message msg) {        switch (msg.what) {        case ABConst.Call_Msg:            handleCallMsg(callbcak, msg);            break;        }        return false;    }    private static void handleCallMsg(Callback callbcak, final Message msg) {        if (ABConst.Call_Msg == msg.what) {                             A_B_Callbcak abCallbcak = (A_B_Callbcak) callbcak;            // A传给B的Map数据            Map<String, Object> callMap = (Map<String, Object>) msg.obj;            //重新封装一个Call_Listener,B使用这个Call_Listener发送消息给A,            //消息中包含了B.c()方法执行完毕的结果            Call_Listener call_Listener_new = new Call_Listener() {                Handler mHandler = (Handler) msg.getTarget();                @Override                public void cCallback(Map<String, Object> callBackMap) {                    Message callBackMsg = new Message();                    callBackMsg .obj = callBackMap;                    callBackMsg .what = ABConst.Call_Back_Msg;                    mHandler.handleMessage(callBackMsg );                }            };            //记得将Call_Listener 放置到map中,记得传给B            callMap.put(ABConst.d.ataCall_Listener_new, call_Listener_new );            // B处理A发送的Call_Msg消息,A---map数据--->B            abCallbcak .c(callMap);        }    }}final class ABConst{    //消息标识    public static final int Call_Msg= 0x99;//Call_Back_Msg.what    public static final int Call_Back_Msg= 0x100;//Call_Back_Msg.what    //A给B的数据参数名字    public static final String dataParam_1="dataParam_1";    public static final String dataCall_Listener_old="dataCall_Listener_old";    public static final String dataCall_Listener_new="dataCall_Listener_new";    public static final String dataClass_Instance="dataClass_Instance";    //B给A的数据参数名字    public static final String dataResult="dataResult";}
0 0
原创粉丝点击