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";
}