Skip to content

Instantly share code, notes, and snippets.

@StanKocken
Created April 24, 2015 08:47
Show Gist options
  • Save StanKocken/132a314852cbea110cd8 to your computer and use it in GitHub Desktop.
Save StanKocken/132a314852cbea110cd8 to your computer and use it in GitHub Desktop.
ListenerKeeper
package com.preplay.android.util;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.view.View;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class ListenerKeeper<T> {
private final Set<WeakReference<T>> mListWeakReference = new HashSet<WeakReference<T>>();
private final Set<T> mListHardReference = new HashSet<T>();
public void add(T listener) {
if (checkNullListener(listener)) {
return;
}
if (shouldBeWeakReference(listener)) {
addWeakReference(listener);
} else {
addHardReference(listener);
}
}
public void addWeakReference(T listener) {
if (checkNullListener(listener)) {
return;
}
synchronized (mListWeakReference) {
Iterator<WeakReference<T>> iterator = mListWeakReference.iterator();
while (iterator.hasNext()) {
WeakReference<T> weakReference = iterator.next();
T reference = weakReference.get();
if (listener.equals(reference)) {
// already in our list, don't add it again
return;
}
}
mListWeakReference.add(new WeakReference<T>(listener));
}
}
public void remove(T listener) {
if (checkNullListener(listener)) {
return;
}
removeWeakListener(listener);
removeHardListener(listener);
}
public void removeAll() {
removeAllWeakListeners();
removeAllHardListeners();
}
public List<T> generateListListener() {
List<T> list = new ArrayList<T>();
addHardReferenceTo(list);
addWeakReferencesTo(list);
return list;
}
public boolean hasListeners() {
synchronized (mListHardReference) {
if (!mListHardReference.isEmpty()) {
return true;
}
}
synchronized (mListWeakReference) {
if (!mListWeakReference.isEmpty()) {
return true;
}
}
return false;
}
private void removeAllHardListeners() {
synchronized (mListHardReference) {
mListHardReference.clear();
}
}
private void removeAllWeakListeners() {
synchronized (mListWeakReference) {
mListWeakReference.clear();
}
}
private void removeHardListener(T listener) {
synchronized (mListHardReference) {
mListHardReference.remove(listener);
}
}
private void removeWeakListener(T listener) {
synchronized (mListWeakReference) {
Iterator<WeakReference<T>> iterator = mListWeakReference.iterator();
while (iterator.hasNext()) {
WeakReference<T> weakReference = iterator.next();
T reference = weakReference.get();
if (listener.equals(reference)) {
iterator.remove();
}
}
}
}
private void addHardReferenceTo(List<T> list) {
synchronized (mListHardReference) {
list.addAll(mListHardReference);
}
}
private void addWeakReferencesTo(List<T> list) {
synchronized (mListWeakReference) {
Iterator<WeakReference<T>> iterator = mListWeakReference.iterator();
while (iterator.hasNext()) {
WeakReference<T> weakReference = iterator.next();
T reference = weakReference.get();
if (reference == null) {
iterator.remove();
} else {
list.add(reference);
}
}
}
}
private void addHardReference(T listener) {
synchronized (mListHardReference) {
mListHardReference.add(listener);
}
}
private boolean shouldBeWeakReference(T listener) {
boolean shouldBeWeek = listener instanceof Context;
if (AndroidUtil.isAndroidUpTo(11)) {
shouldBeWeek |= (listener instanceof android.app.Fragment);
}
shouldBeWeek |= (listener instanceof Fragment);
shouldBeWeek |= (listener instanceof View);
return shouldBeWeek;
}
private boolean checkNullListener(T listener) {
if (listener == null) {
PPLog.e("You tried to add a null listener");
return true;
}
return false;
}
}
@StanKocken
Copy link
Author

Call "generateListListener()" to have a list of listener when necessary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment