Android 组件间通信--事件驱动

ゝ一世哀愁。 2022-08-06 11:27 266阅读 0赞

在android中,组件间通信常用的方式:

1、使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可

例如:常用app结构中,左边通常为菜单栏,点击菜单栏,中间页面变化。当点击菜单时发送广播通知容器变化显示的Fragment

2、使用接口方式:activity实现特定的接口,在子类或者Fragment中获取到Activity对象,转换成特定的接口对象,调用接口方法

3、事件驱动方式:EventManager

最近在网上看到EventBus这个开源的工程,使用订阅者与发送者模式进行信息传递非常适合项目使用,并且耦合度可以降到非常低!

这个完全可以自己根据业务需求自己实现,主要的逻辑就是:注册事件,取消监听,发送事件 ,需要注意的是事件管理使用单例模式是比较合适的,但是需要注意并发问题!

代码如下:

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import android.os.Handler;
  6. import android.os.Looper;
  7. public class EventManager {
  8. public static class Message {
  9. public int what;
  10. public Object obj;
  11. }
  12. public static interface OnEventReceiver {
  13. public void onEvent(Message message);
  14. }
  15. private static EventManager manager;
  16. private Map<Class, List<OnEventReceiver>> map = new HashMap<Class, List<OnEventReceiver>>();
  17. private Handler handler = new Handler(Looper.getMainLooper());
  18. public static EventManager getDefault() {
  19. if (null == manager) {
  20. synchronized (EventManager.class) {
  21. if (null == manager) {
  22. manager = new EventManager();
  23. }
  24. }
  25. }
  26. return manager;
  27. }
  28. private EventManager() {
  29. }
  30. public synchronized void register(Class clazz, OnEventReceiver receiver) {
  31. List<OnEventReceiver> receivers = map.get(clazz);
  32. if (null == receivers) {
  33. receivers = new ArrayList<EventManager.OnEventReceiver>();
  34. map.put(clazz, receivers);
  35. }
  36. receivers.add(receiver);
  37. }
  38. public synchronized void unRegister(Class clazz) {
  39. map.remove(clazz);
  40. }
  41. public synchronized void postMessage(Class clazz, final Message message) {
  42. List<OnEventReceiver> receivers = map.get(clazz);
  43. if (null != receivers) {
  44. //判断是否在主线程中
  45. boolean isUiThread = Looper.getMainLooper() == Looper.myLooper();
  46. for (final OnEventReceiver receiver : receivers) {
  47. if (!isUiThread) {
  48. handler.post(new Runnable() {
  49. @Override
  50. public void run() {
  51. receiver.onEvent(message);
  52. }
  53. });
  54. } else {
  55. receiver.onEvent(message);
  56. }
  57. }
  58. }
  59. }
  60. }

更多的功能需要根据业务需求进行修改,注意并发哦!!

发表评论

表情:
评论列表 (有 0 条评论,266人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android 之间通信

    一、背景 Android开发中你的模块(Module)一般只有一个app主模块,随着功能不断扩展你会发现一个模块的缺点就是各种业务高度耦合,你就想测试登录模块,那么你可能