diff --git a/app_pojavlauncher/src/main/java/com/kdt/mcgui/ProgressLayout.java b/app_pojavlauncher/src/main/java/com/kdt/mcgui/ProgressLayout.java index af8f69dd6..38d5719d2 100644 --- a/app_pojavlauncher/src/main/java/com/kdt/mcgui/ProgressLayout.java +++ b/app_pojavlauncher/src/main/java/com/kdt/mcgui/ProgressLayout.java @@ -65,6 +65,12 @@ public class ProgressLayout extends ConstraintLayout implements View.OnClickList mMap.add(new LayoutProgressListener(progressKey)); } + public void cleanUpObservers() { + for(LayoutProgressListener progressListener : mMap) { + ProgressKeeper.removeListener(progressListener.progressKey, progressListener); + } + } + public boolean hasProcesses(){ return ProgressKeeper.getTaskCount() > 0; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java index 432344c04..6088f62bd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java @@ -190,6 +190,7 @@ public class LauncherActivity extends BaseActivity { @Override protected void onDestroy() { super.onDestroy(); + mProgressLayout.cleanUpObservers(); ProgressKeeper.removeTaskCountListener(mProgressLayout); ProgressKeeper.removeTaskCountListener(mProgressServiceKeeper); ExtraCore.removeExtraListenerFromValue(ExtraConstants.BACK_PREFERENCE, mBackPreferenceListener); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/progresskeeper/ProgressKeeper.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/progresskeeper/ProgressKeeper.java index 973655c55..10d02d6f3 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/progresskeeper/ProgressKeeper.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/progresskeeper/ProgressKeeper.java @@ -2,14 +2,12 @@ package net.kdt.pojavlaunch.progresskeeper; import android.util.Log; -import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public class ProgressKeeper { - private static final ConcurrentHashMap>> sProgressListeners = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap> sProgressListeners = new ConcurrentHashMap<>(); private static final ConcurrentHashMap sProgressStates = new ConcurrentHashMap<>(); private static final ArrayList sTaskCountListeners = new ArrayList<>(); @@ -32,19 +30,13 @@ public class ProgressKeeper { } Log.d("ProgressLayout", "shouldCallStarted="+shouldCallStarted+" shouldCallEnded="+shouldCallEnded); - ConcurrentLinkedQueue> listenerWeakReferenceList = sProgressListeners.get(progressRecord); - if(listenerWeakReferenceList != null) { - Iterator> iterator = listenerWeakReferenceList.iterator(); - while(iterator.hasNext()) { - ProgressListener listener = iterator.next().get(); - Log.i("ProgressLayout", listener+""); - if(listener != null) { + ConcurrentLinkedQueue progressListeners = sProgressListeners.get(progressRecord); + if(progressListeners != null) + for(ProgressListener listener : progressListeners) { if(shouldCallStarted) listener.onProgressStarted(); else if(shouldCallEnded) listener.onProgressEnded(); else listener.onProgressUpdated(progress, resid, va); - } else iterator.remove(); } - } } private static void updateTaskCount() { @@ -59,20 +51,19 @@ public class ProgressKeeper { if(state != null && (state.resid != -1 || state.progress != -1)) { listener.onProgressStarted(); listener.onProgressUpdated(state.progress, state.resid, state.varArg); - Log.d("ProgressLayout", "Resubmitting UI state"); }else{ listener.onProgressEnded(); } - ConcurrentLinkedQueue> listenerWeakReferenceList = sProgressListeners.get(progressRecord); + ConcurrentLinkedQueue listenerWeakReferenceList = sProgressListeners.get(progressRecord); if(listenerWeakReferenceList == null) sProgressListeners.put(progressRecord, (listenerWeakReferenceList = new ConcurrentLinkedQueue<>())); - else { - Iterator> iterator = listenerWeakReferenceList.iterator(); - while(iterator.hasNext()) { - if(iterator.next().get() == null) iterator.remove(); - } - } - listenerWeakReferenceList.add(new WeakReference<>(listener)); + listenerWeakReferenceList.add(listener); } + + public static void removeListener(String progressRecord, ProgressListener listener) { + ConcurrentLinkedQueue listenerWeakReferenceList = sProgressListeners.get(progressRecord); + if(listenerWeakReferenceList != null) listenerWeakReferenceList.remove(listener); + } + public static void addTaskCountListener(TaskCountListener listener) { listener.onUpdateTaskCount(sProgressStates.size()); if(!sTaskCountListeners.contains(listener)) sTaskCountListeners.add(listener);