使用事件总线eventbus替代startactivityforresult
来源:互联网 发布:激光祛痘的危害 知乎 编辑:程序博客网 时间:2024/06/01 17:31
前几天我介绍过带返回值的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
- 使用事件总线eventbus替代startactivityforresult
- 事件总线---EventBus使用
- 事件总线-EVENTBUS的使用
- EventBus事件总线的使用
- EventBus事件总线的使用
- 事件总线EventBus Android开源库的使用
- 使用事件总线框架EventBus和Otto
- 使用事件总线框架EventBus和Otto
- 使用事件总线框架EventBus和Otto
- 事件总线分发库EventBus的使用
- 关于事件总线EventBus的使用
- EventBus事件总线,eventvus的使用
- 事件总线分发库--EventBus的使用
- EventBus事件总线框架的使用
- EventBus事件总线库
- Guava - EventBus(事件总线)
- EventBus--事件总线
- EventBus 3.0 事件总线
- 发送邮件
- Aerospike数据库实战(五) -- Aerospike C Client 开发
- Java集合库整体类结构
- 程序员面试金典: 9.9 递归和动态规划 9.6打印n对括号的全部有效组合
- xshell项目启动基本配置
- 使用事件总线eventbus替代startactivityforresult
- 第一个只出现一次的字符
- PAT甲级1011
- Java Socket编程1--讲解
- gulp入门教程
- 统计学相关基础
- js中函数没有重载,只有覆盖
- Struts1 Action
- Celery 学习笔记(3)- 任务和任务执行