Posted May 17, 201312 yr What it says on the package. For example, in NetworkRegistry there is a private member called "chatListeners" and there is a way to add to it (registerChatListener) but no way to remove from it. unregisterChatListener would take a listener and simply remove it by value. Though this would really have negligable effect on performance over just setting a "ignoreEverything" flag on the listener itself, I think it's a more concise way to manage listeners for all sorts of messages (not just chat). Plus when debugging or adding status monitors in the future, there wouldn't be a lot of (internally dead) listeners cluttering up the list. Should be trivial to implement in most cases, if a bit of busywork. I might do it myself later on github.
May 18, 201312 yr Use reflection: Make a method in one of your classes to set the member accessible and then remove from it. I've done that: public static void removeChatListener(int index) { try { Field f = NetworkRegistry.class.getDeclaredField("chatListeners"); f.setAccessible(true); List<IChatListener> list = (List<IChatListener>) f.get(NetworkRegistry.instance()); if(list.get(index) != null) { IChatListener c = list.get(index); System.out.println("Removed chat listener " + c); list.remove(index); } } catch(Exception e) { System.err.println("Tried to remove chat listener " + index + " but it didn't work! ):"); e.printStackTrace(); } } Alternatively, you can change int index to be a Class object, assuming you know the exact class of the listener you're trying to remove. IE: public static void removeChatListener(Class listener) { try { Field f = NetworkRegistry.class.getDeclaredField("chatListeners"); f.setAccessible(true); List<IChatListener> list = (List<IChatListener>) f.get(NetworkRegistry.instance()); for(int i = 0; i < list.size(); i++) { IChatListener check = list.get(i); if(check.getClass() == listener) { System.out.println("Removed chat listener " + check); list.remove(check); } } } catch(Exception e) { System.out.println("Tried to remove a chat listener but it didn't work. ):"); e.printStackTrace(); } }
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.