通过接口回调实现简易的eventbus(原创,转载请标注)
2018-03-07 本文已影响58人
江南小夜
eventbus是一个非常火的Android事件发布/订阅框架,主要是简化了应用程序内各组件间、组件与后台线程间的通信。今天在不是教大家怎么去使用eventbus,也不是教大家分析eventbus的源码,因为这些教程网上已经有很多很多了。今天主要是教大家怎么用接口回调的形式去实现一个简易的eventbus,如有什么bug欢迎指出,我会及时完善和改进。代码还是很简单的,下面直接上代码:
先定义一个bean:
/**
* Created by genius-ye on 2018/3/7.
*/
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
这个bean很简单就不解释了。接下来就是主角上场了:
/**
* 通过接口回调实现简易的eventbus
*
* Created by genius-ye on 2018/3/7.
*/
public class EventPresenter {
private static final EventPresenter ourInstance = new EventPresenter();
// private EventCallback eventCallback;
private Map<Activity, ArrayList<EventCallback>> map = new HashMap<>();
public static EventPresenter getInstance() {
return ourInstance;
}
private EventPresenter() {
}
/**
* 注册
*/
public void regist(Activity activity, EventCallback eventCallback) {
ArrayList<EventCallback> arrayList;
if (map.containsKey(activity)) {
arrayList = map.get(activity);
arrayList.add(eventCallback);
} else {
arrayList = new ArrayList<>();
arrayList.add(eventCallback);
map.put(activity, arrayList);
}
}
/**
* 发送事件
*/
public void sendEvent(Object obj) {
//遍历map中的value
for (ArrayList<EventCallback> arrayList : map.values()) {
for (EventCallback eventCallback : arrayList) {
if (eventCallback != null) {
Type[] interfacesTypes = eventCallback.getClass().getGenericInterfaces();
for (Type t : interfacesTypes) {
if (t instanceof ParameterizedType) {
Type[] genericType2 = ((ParameterizedType) t).getActualTypeArguments();
Class<?> cls = (Class<?>) genericType2[0];
if (obj.getClass().isAssignableFrom(cls)) {
eventCallback.onMainEvent(obj);
}
}
}
}
}
}
}
/**
* 解绑
*/
public void unregist(Activity activity) {
if (map.containsKey(activity)) {
map.remove(activity);
}
}
/**
* 回调的接口
* @param <T>
*/
public interface EventCallback<T> {
void onMainEvent(T t);
}
}
最后就是 EventPresenter 这个类的使用了,使用也很简单:
在要发送的activity中调用sendEvent(obj)方法:
发送对象:EventPresenter.getInstance().sendEvent(new User("张三",20));
发送字符串:EventPresenter.getInstance().sendEvent("hello world!");
当然了可以发送任何object。
在要接收的activity中注册接收:
接收对象:
EventPresenter.getInstance().regist(this,new EventPresenter.EventCallback<User>() {
@Override
public void onMainEvent(User user) {
showToast(user.getName()+"---"+getLocalClassName());
textView.setText(user.getName()+"------"+user.getAge());
Log.d(MainActivity.class.getSimpleName(), user.getName());
}
});
接收字符串:
EventPresenter.getInstance().regist(this, new EventPresenter.EventCallback<String>() {
@Override
public void onMainEvent(String s) {
Log.d(MainActivity.class.getSimpleName(), s);
}
});
最后别忘了销毁,在activity的onDestroy()方法中:
@Override
protected void onDestroy() {
super.onDestroy();
EventPresenter.getInstance().unregist(this);
}