android-Android 自己写的一个全局事件管理器,感觉还有点儿问题,提上代码,希望大神们修改修改!!!

问题描述

Android 自己写的一个全局事件管理器,感觉还有点儿问题,提上代码,希望大神们修改修改!!!


import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.SparseArray;
import android.view.View;
import com.sintn.hera.shop.event.Event;
import com.sintn.utils.common.SystemCommonUtils;
import com.sintn.utils.core.EventManager;

/**
 *
 * @Description: 全局事件管理者
 * @ClassName: AndroidEventManager
 * @author wxl.sinto.cto
 * @date 2014-10-21 下午2:37:34
 *
 */
public class AndroidEventManager extends EventManager
{

    private static AndroidEventManager sInstance;

    public static AndroidEventManager getInstance()
    {
        if (sInstance == null)
        {
            sInstance = new AndroidEventManager();
        }
        return sInstance;
    }

    private static final int WHAT_EVENT_NOTIFY = 1;
    private static final int WHAT_EVENT_RUN = 2;

    private SparseArray<Event> codeToEventMap = new SparseArray<Event>();

    private List<EventWrapper> eventWrappers = new LinkedList<EventWrapper>();

    private Map<Event, Event> eventRunningMap = new ConcurrentHashMap<Event, Event>();

    private List<Event> eventNotifyEvents = new LinkedList<Event>();
    private boolean isEventNotifying;

    private SparseArray<List<OnEventListener>> codeToEventListenerMap = new SparseArray<List<OnEventListener>>();
    private SparseArray<List<OnEventListener>> codeToEventListenerAddCacheMap = new SparseArray<List<OnEventListener>>();
    private SparseArray<List<OnEventListener>> codeToEventListenerRemoveCacheMap = new SparseArray<List<OnEventListener>>();
    private boolean isMapListenerLock = false;
    private SparseArray<OnEventListener> listenerUserOnceMap = new SparseArray<OnEventListener>();

    private Map<Event, List<ParamWrapper>> eventToWaitRunParamMap = new ConcurrentHashMap<Event, List<ParamWrapper>>();

    private static Handler handler = new Handler(Looper.getMainLooper())
    {
        @Override
        public void handleMessage(Message msg)
        {
            final int nWhat = msg.what;
            if (nWhat == WHAT_EVENT_RUN)
            {
                EventWrapper ew = (EventWrapper) msg.obj;
                sInstance.runEvent(ew.mEvent, ew.mParams);
                sInstance.recycleEventWrapper(ew);
            } else if (nWhat == WHAT_EVENT_NOTIFY)
            {
                sInstance.doNotify((Event) msg.obj);
            }
        }
    };

    @Override
    public void addEvent(Event event)
    {
        codeToEventMap.put(event.getEventCode(), event);
    }

    @Override
    public void removeEvent(int nEventCode)
    {
        codeToEventMap.remove(nEventCode);
    }

    @Override
    public void removeAllEvent()
    {
        codeToEventMap.clear();
    }

    @Override
    public void postEvent(int nEventCode, long delayMillis, Object... params)
    {
        Event event = getEvent(nEventCode);
        postEvent(event, delayMillis, params);
    }

    public void postEvent(int nEventCode, long delayMillis, View view, Object... params)
    {
        Event event = getEvent(nEventCode);
        event.relationView = view;
        postEvent(event, delayMillis, params);
    }

    @Override
    public void postEvent(Event event, long delayMillis, Object... params)
    {
        if (event != null)
        {
            EventWrapper ew = obtainEventWrapper();
            ew.set(event, params);
            handler.sendMessageDelayed(handler.obtainMessage(WHAT_EVENT_RUN, ew), delayMillis);
        }
    }

    private synchronized EventWrapper obtainEventWrapper()
    {
        if (eventWrappers.size() > 0)
        {
            EventWrapper ev = eventWrappers.get(0);
            eventWrappers.remove(0);
            return ev;
        }
        return new EventWrapper();
    }

    private synchronized void recycleEventWrapper(EventWrapper ew)
    {
        ew.clear();
        eventWrappers.add(ew);
    }

    public void addEventListener(int nEventCode, OnEventListener listener, boolean bOnce)
    {
        if (isMapListenerLock)
        {
            addToListenerMap(codeToEventListenerAddCacheMap, nEventCode, listener);
        } else
        {
            addToListenerMap(codeToEventListenerMap, nEventCode, listener);
        }
        if (bOnce)
        {
            listenerUserOnceMap.put(calculateHashCode(nEventCode, listener), listener);
        }
    }

    public void removeEventListener(int nEventCode, OnEventListener listener)
    {
        if (isMapListenerLock)
        {
            addToListenerMap(codeToEventListenerRemoveCacheMap, nEventCode, listener);
        } else
        {
            List<OnEventListener> listeners = codeToEventListenerMap.get(nEventCode);
            if (listeners != null)
            {
                listeners.remove(listener);
            }
        }
    }

    private int calculateHashCode(int nEventCode, OnEventListener listener)
    {
        int nResult = nEventCode;
        nResult = nResult * 29 + listener.hashCode();
        return nResult;
    }

    /**
     * 发送通知
     *
     * @param event
     */
    private synchronized void doNotify(Event event)
    {
        isEventNotifying = true;
        isMapListenerLock = true;
        List<OnEventListener> list = codeToEventListenerMap.get(event.getEventCode());
        if (list != null)
        {
            List<OnEventListener> listNeedRemove = null;
            //轮询模式
            for (OnEventListener listener : list)
            {
                listener.onEventRunEnd(event);
                int nHashCode = calculateHashCode(event.getEventCode(), listener);
                if (listenerUserOnceMap.get(nHashCode) != null)
                {
                    listenerUserOnceMap.remove(nHashCode);
                    if (listNeedRemove == null)
                    {
                        listNeedRemove = new ArrayList<EventManager.OnEventListener>();
                    }
                    listNeedRemove.add(listener);
                    BaseApplication.getLogger().info("removeOnce Code:" + event.getEventCode() + " listener:" + listener);
                }
            }
            if (listNeedRemove != null)
            {
                list.removeAll(listNeedRemove);
            }
        }
        isMapListenerLock = false;

        isEventNotifying = false;

        if (codeToEventListenerAddCacheMap.size() > 0)
        {
            int nSize = codeToEventListenerAddCacheMap.size();
            for (int nIndex = 0; nIndex < nSize; ++nIndex)
            {
                int nCode = codeToEventListenerAddCacheMap.keyAt(nIndex);
                List<OnEventListener> listCache = codeToEventListenerAddCacheMap.get(nCode);
                if (listCache.size() > 0)
                {
                    List<OnEventListener> listeners = codeToEventListenerMap.get(nCode);
                    if (listeners == null)
                    {
                        listeners = new LinkedList<AndroidEventManager.OnEventListener>();
                        codeToEventListenerMap.put(nCode, listeners);
                    }
                    listeners.addAll(listCache);
                }
            }
            codeToEventListenerAddCacheMap.clear();
        }
        if (codeToEventListenerRemoveCacheMap.size() > 0)
        {
            int nSize = codeToEventListenerRemoveCacheMap.size();
            for (int nIndex = 0; nIndex < nSize; ++nIndex)
            {
                int nCode = codeToEventListenerRemoveCacheMap.keyAt(nIndex);
                List<OnEventListener> listCache = codeToEventListenerRemoveCacheMap.get(nCode);
                if (listCache.size() > 0)
                {
                    List<OnEventListener> listeners = codeToEventListenerMap.get(nCode);
                    if (listeners != null)
                    {
                        listeners.removeAll(listCache);
                    }
                }
            }
            codeToEventListenerRemoveCacheMap.clear();
        }

        if (eventNotifyEvents.size() > 0)
        {
            Event eventNotify = eventNotifyEvents.get(0);
            eventNotifyEvents.remove(0);
            handler.sendMessage(handler.obtainMessage(WHAT_EVENT_NOTIFY, eventNotify));
        }

    }

    @Override
    public Event runEvent(int nEventCode, Object... params)
    {
        Event event = getEvent(nEventCode);
        return runEvent(event, params);
    }

    @Override
    public Event runEvent(Event event, final Object... params)
    {
        if (event == null)
        {
            return null;
        }
        if (eventRunningMap.containsKey(event))
        {
            if (event.isWaitRunWhenRunning())
            {
                List<ParamWrapper> listParamWrapper = eventToWaitRunParamMap.get(event);
                if (listParamWrapper == null)
                {
                    listParamWrapper = Collections.synchronizedList(new LinkedList<ParamWrapper>());
                    eventToWaitRunParamMap.put(event, listParamWrapper);
                }
                listParamWrapper.add(new ParamWrapper(params));
            }
            return null;
        }

        eventRunningMap.put(event, event);

        if (event.isAsyncRun())
        {
            final Event localEvent = event;

            localEvent.onPreRun();
            new Thread()
            {
                @Override
                public void run()
                {
                    try
                    {
                        if (SystemCommonUtils.isNetworkAvailable(BaseApplication.getApplication()))
                        {
                            synchronized (AndroidEventManager.class)
                            {
                                localEvent.run(params);
                            }
                        }
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    } finally
                    {
                        BaseApplication.getMainThreadHandler().post(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                onEventRunEnd(localEvent);
                            }
                        });
                    }
                }
            }.start();
        } else
        {
            try
            {
                event.run(params);
            } catch (Exception e)
            {
                e.printStackTrace();
            }
            onEventRunEnd(event);
        }
        return event;

    }

    private void addToListenerMap(SparseArray<List<OnEventListener>> map, int nEventCode, OnEventListener listener)
    {
        List<OnEventListener> listeners = map.get(nEventCode);
        if (listeners == null)
        {
            listeners = new LinkedList<AndroidEventManager.OnEventListener>();
            map.put(nEventCode, listeners);
        }
        listeners.add(listener);
    }

    protected void onEventRunEnd(Event event)
    {
        eventRunningMap.remove(event);

        event.onRunEnd();

        if (event.isNotifyAfterRun())
        {
            notifyEventRunEnd(event);
        }

        List<ParamWrapper> listParamWrapper = eventToWaitRunParamMap.get(event);
        if (listParamWrapper != null)
        {
            if (listParamWrapper.size() > 0)
            {
                ParamWrapper param = listParamWrapper.get(0);
                listParamWrapper.remove(param);
                postEvent(event, 0, param.mParams);
                if (listParamWrapper.size() == 0)
                {
                    eventToWaitRunParamMap.remove(event);
                }
            }
        }
    }

    private void notifyEventRunEnd(Event event)
    {
        if (isEventNotifying)
        {
            eventNotifyEvents.add(event);
        } else
        {
            doNotify(event);
        }
    }

    public Event getEvent(int nEventCode)
    {
        return codeToEventMap.get(nEventCode);
    }

    private static class EventWrapper
    {
        public Event mEvent;
        public Object[] mParams;

        public void set(Event event, Object... params)
        {
            mEvent = event;
            mParams = params;
        }

        public void clear()
        {
            mEvent = null;
            mParams = null;
        }
    }

    private static class ParamWrapper
    {
        public Object[] mParams;

        public ParamWrapper(Object[] params)
        {
            mParams = params;
        }
    }

}

解决方案

单例模式创建对象没有定义私有的构造方法。。

时间: 2024-11-03 16:30:09

android-Android 自己写的一个全局事件管理器,感觉还有点儿问题,提上代码,希望大神们修改修改!!!的相关文章

c#-自己用C#做了一个可以实现多人聊天的程序 调试时一直提示错误 大神帮帮忙 修改一下!!!谢谢了

问题描述 自己用C#做了一个可以实现多人聊天的程序 调试时一直提示错误 大神帮帮忙 修改一下!!!谢谢了 文件下载地址:https://pan.baidu.com/s/1i3NdLf3 提取密码:iw3h 大神帮忙看看 修改一下 小弟谢谢了!!! 解决方案 这个网上有很多栗子的哦. 解决方案二: 想知道我的程序到底哪里错了 求大神能解答 解决方案三: 想知道我的程序到底哪里错了 求大神能解答

android 一个button 标签出错。莫名其妙!找不到,希望大神帮我看看 在线等

问题描述 android 一个button 标签出错.莫名其妙!找不到,希望大神帮我看看 在线等 1C 解决方案 红线不是标了有错吗? 解决方案二: 对啊 那种错误看不懂 解决方案三: 首先,你要确定你在res/values/style.xml这个文件中你已经设置了dialog_blue_button这个属性,这样起码能够找到这个对象,如果有的话你可以clean一下整个工程,让Eclipse重新编译一次,因为有时候Eclipse反应慢,不clean不会刷新工程目录,你试试,不行可以问我. 解决方

eclipse-初学Android创建的第一个App出现Layout界面显示不出以及两个警告 求各位大神帮忙!

问题描述 初学Android创建的第一个App出现Layout界面显示不出以及两个警告 求各位大神帮忙! 1.This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in 2.[2015-07-21 21:46:26 - appcompat_v7] WARNING: unable to write jarlist cache file

指针-Android播放视频遇到的困难,希望大神给点思路

问题描述 Android播放视频遇到的困难,希望大神给点思路 Android 使用SurfaceView播放视频 想在进入Anctivity后自动播放视频,我在onStart方法调用播放方法, 后台打印视频路径是对的,但是报空指针异常,然后我用一个Button控制播放是可以的(页面加载完成后使用 Button的点击事件调用播放方法是可行),这是为什么?求大神给点思路,谢谢了...... 解决方案 你可以看看Activity的生命周期!!!在onStart方法里面SurfaceView控件还没有被

问题-刚开始学习java ,自己写了一个聊天小程序,没报错但是有毛病,希望能帮忙问一下

问题描述 刚开始学习java ,自己写了一个聊天小程序,没报错但是有毛病,希望能帮忙问一下 刚开始学习java ,自己写了一个聊天小程序,没有报任何错误.测试时打开3个聊天小窗口 A,B,C,在A中输入文字,只在B中显示出来了,而且显示出了三句相同语句.查了好几个小时都没有查出来,希望高手能帮帮忙,看看是怎么回事,并且告诉我是通过什么方法找出来的. 以下是客户端和服务器端代码 客户端: import java.awt.*; import java.awt.event.*; import java

android http POST请求方式向服务其发送数据不成功 贴出代码求大神帮解决一下

问题描述 android http POST请求方式向服务其发送数据不成功 贴出代码求大神帮解决一下 new Thread(new Runnable() { @Override public void run() { String szSrc = ""abcdefghijkl123456789123"" ; byte[] encoded = ThreeDes.encryptMode(keyBytes szSrc.getBytes()); try { /* Strin

cocos2d x-cocos2d-X关于监听事件的一个小问题(希望大神帮助)

问题描述 cocos2d-X关于监听事件的一个小问题(希望大神帮助) _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite1); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), sprite2); 这个我对两个精灵做事件添加,为什么第二个精灵注册的时候为什么是调用这个listener->

谁来帮帮我运行android的时候出现这个问题怎么解决呢,回答有重赏。。。。。大神

问题描述 谁来帮帮我运行android的时候出现这个问题怎么解决呢,回答有重赏.....大神 05-20 05:07:15.757: W/dalvikvm(668): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 05-20 05:07:15.788: E/AndroidRuntime(668): FATAL EXCEPTION: main 05-20 05:07:15.788: E/AndroidRu

linux编程-大菜鸟求教linux,想用c写一个helloworld不知从哪里下手,零基础伤不起啊,求大神指点。

问题描述 大菜鸟求教linux,想用c写一个helloworld不知从哪里下手,零基础伤不起啊,求大神指点. 解决方案 用apt安装gcc,用vim或者任意的编辑器创建源代码,用gcc编译. 解决方案二: 红帽啊?没用红帽,只用ubuntu,不过应该都差不多吧,打开终端,然后进入相应的目录,通过vim新建文件进行编辑 解决方案三: 进入终端,用vi创建一个.c文件,在里边用c语言写个程序,运行即可