热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在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);
				}

			}
		}
	}

}

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


推荐阅读
author-avatar
潇湘V烟雨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有