android中的Handler和Callback机制

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值