作者:潇湘V烟雨 | 来源:互联网 | 2023-10-11 18:05
在android中,组件间通信常用的方式:1、使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可例如:常用app结构中,左边通常为菜单栏,点
在android中,组件间通信常用的方式:
1、使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可
例如:常用app结构中,左边通常为菜单栏,点击菜单栏,中间页面变化。当点击菜单时发送广播通知容器变化显示的Fragment
2、使用接口方式:activity实现特定的接口,在子类或者Fragment中获取到Activity对象,转换成特定的接口对象,调用接口方法
3、事件驱动方式:EventManager
最近在网上看到EventBus这个开源的工程,使用订阅者与发送者模式进行信息传递非常适合项目使用,并且耦合度可以降到非常低!
这个完全可以自己根据业务需求自己实现,主要的逻辑就是:注册事件,取消监听,发送事件 ,需要注意的是事件管理使用单例模式是比较合适的,但是需要注意并发问题!
代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.os.Handler;
import android.os.Looper;
public class EventManager {
public static class Message {
public int what;
public Object obj;
}
public static interface OnEventReceiver {
public void onEvent(Message message);
}
private static EventManager manager;
private Map> map = new HashMap>();
private Handler handler = new Handler(Looper.getMainLooper());
public static EventManager getDefault() {
if (null == manager) {
synchronized (EventManager.class) {
if (null == manager) {
manager = new EventManager();
}
}
}
return manager;
}
private EventManager() {
}
public synchronized void register(Class clazz, OnEventReceiver receiver) {
List receivers = map.get(clazz);
if (null == receivers) {
receivers = new ArrayList();
map.put(clazz, receivers);
}
receivers.add(receiver);
}
public synchronized void unRegister(Class clazz) {
map.remove(clazz);
}
public synchronized void postMessage(Class clazz, final Message message) {
List receivers = map.get(clazz);
if (null != receivers) {
//判断是否在主线程中
boolean isUiThread = Looper.getMainLooper() == Looper.myLooper();
for (final OnEventReceiver receiver : receivers) {
if (!isUiThread) {
handler.post(new Runnable() {
@Override
public void run() {
receiver.onEvent(message);
}
});
} else {
receiver.onEvent(message);
}
}
}
}
}
更多的功能需要根据业务需求进行修改,注意并发哦!!