notifyListener无法调用handler

本文介绍了一种在使用Panel组件并为其添加事件监听时遇到的问题:尽管已经正确地添加了监听器,在尝试触发监听器时却未能成功调用相应的处理方法。通过分析代码示例,发现导致该问题的原因在于使用了不正确的Event ID——int0。

现象:在panel上添加了事件监听,但在调用panel.nofityLister(PanelEvent.EventType, new Event())触发的时候, handler并没有被调用。

panel.addListener(PanelEvent.EventType, new Listener(){
	@Override
	public void handleEvent(Event arg0) {
	// TODO Auto-generated method stub		
	}
});

原因:用了int 0作为Event的ID。
package com.speedtalk.app.call.utils; import android.os.Handler; import android.os.Looper; import com.speedtalk.app.call.listener.IEventListener; import java.lang.ref.WeakReference; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.List; import java.util.Map; public class AEvent { // 使用 ConcurrentHashMap 和 CopyOnWriteArrayList 提高并发性能 private static final Map<String, List<WeakReference<IEventListener>>> callBackMap = new ConcurrentHashMap<>(); private static Handler mHandler; public static void setHandler(Handler handler) { mHandler = handler; } public static void addListener(String eventID, IEventListener eventListener) { callBackMap.computeIfAbsent(eventID, k -> new CopyOnWriteArrayList<>()) .add(new WeakReference<>(eventListener)); } public static void removeListener(String eventID, IEventListener eventListener) { List<WeakReference<IEventListener>> listeners = callBackMap.get(eventID); if (listeners != null) { listeners.removeIf(ref -> ref.get() == eventListener || ref.get() == null); } } public static void notifyListener(final String eventID, final boolean success, final Object object) { if (Looper.myLooper() == Looper.getMainLooper()) { // UI线程 dispatchEvent(eventID, success, object); } else { // 非UI线程 if (mHandler != null) { mHandler.post(() -> dispatchEvent(eventID, success, object)); } else { dispatchEvent(eventID, success, object); } } } private static void dispatchEvent(String eventID, boolean success, Object object) { List<WeakReference<IEventListener>> listeners = callBackMap.get(eventID); if (listeners != null) { listeners.removeIf(ref -> ref.get() == null); // 清理已被回收的监听器 for (WeakReference<IEventListener> ref : listeners) { IEventListener listener = ref.get(); if (listener != null) { listener.dispatchEvent(eventID, success, object); } } } } // 事件类型定义保持不变... public static final String AEVENT_LOGIN = "AEVENT_LOGIN"; // ... 其他事件定义 } 这个是我在android里面写的一个工具类,还有什么优化的地方吗?
最新发布
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值