java :
public class MultiListenerExample {
private ArrayList<OnClickListener> onClickListeners = new ArrayList<OnClickListener>(); private OnClickListener dispatcher;
public void performOnClick(View v) {
dispatch().onClick(v);
}
private OnClickListener dispatch() {
if (dispatcher == null) {
dispatcher = createDispatcher();
}
return dispatcher;
}
private OnClickListener createDispatcher() {
ClassLoader loader = OnClickListener.class.getClassLoader();
Class<?>[] interfaces = new Class[] { OnClickListener.class };
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
for (OnClickListener listener : onClickListeners) {
method.invoke(listener, args);
}
return null;
}
};
return (OnClickListener) Proxy.newProxyInstance(loader, intefaces, handler);
}
}
, dispatch(), InvocationHandler, , .
This method can be safely called because the original call was made on the same interface that we are going to call.
This solution may work as long as your listeners have no return value.
source
share