前几天我介绍过带返回值的activity,其中有两种方法一种是startactivityforresult,另一种是接口回调,今天我介绍另一种方法是eventbus事件总线,eventbus是非常火的一种框架这个模式就是事件总线,它比观察者模式要先进很多。我借鉴了这位博主的思路实现替代forresult:http://blog.csdn.net/crazy__chen/article/details/47425779
下面看实现思路首先自定义eventbus
public class EventBus {
HashMap<Class<?>,ArrayList<Subscription>> subscriptionsByEventType =
new HashMap<Class<?>,ArrayList<Subscription>>();
MainThreadHandler mainThreadHandler = new MainThreadHandler(this, Looper.getMainLooper());
AsyThreadHandler asyThreadHandler = new AsyThreadHandler(this);
private final static EventBus instance = new EventBus();
public static EventBus getInstance(){
return instance;
}
private EventBus(){};
public void register(Object subscriber){
Class<?> clazz = subscriber.getClass();
Method[] methods = clazz.getMethods();
for(Method m:methods){
String name = m.getName();
if(name.startsWith("onEvent")){
Class<?>[] params = m.getParameterTypes();
ArrayList<Subscription> arr;
if(subscriptionsByEventType.containsKey(params[0])){
arr = subscriptionsByEventType.get(params[0]);
}else{
arr = new ArrayList<Subscription>();
}
int len = name.substring("onEvent".length()).length();
Log.i("cky",len+"");
Subscription sub;
if(len==0){
sub = new Subscription(subscriber,new SubscriberMethod(m,params[0],0));
}else{
sub = new Subscription(subscriber,new SubscriberMethod(m,params[0],1));
}
arr.add(sub);
subscriptionsByEventType.put(params[0],arr);
}
}
}
public void post(Object event){
Class<?> clazz = event.getClass();
ArrayList<Subscription> arr = subscriptionsByEventType.get(clazz);
for(Subscription sub:arr){
if(sub.SubscriberMethod.type==0){
asyThreadHandler.post(sub,event);
}else{
mainThreadHandler.post(sub,event);
}
}
}
public void invoke(final Subscription sub, final Object event, Method m){
try {
m.invoke(sub.subscriber,event);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
在activity里面注册事件总线 EventBus.getInstance().register(this);
之后写事件总线的方法
public void onEvent(String i){
Log.i("cky", i);
}
public void onEventMain(String i){
txt_display3.setText(i);
}
public void onEventMain(Info i){
txt_display4.setText(i.msg+i.str3+i.str2);
}
进入第二个页面在其点击事件里面进行事件处理
String message = mMessage3.getText().toString();
// EventBus.getDefault().post(message);
EventBus.getInstance().post(message);
finish();
demo地址:https://github.com/yuanchongzhang/startactivity_CallBack_event_demo-master