No more weak reference hell in ProgressKeeper

This commit is contained in:
artdeell 2022-11-12 14:56:11 +03:00 committed by ArtDev
parent a8e864ac3d
commit 61b72c089c
3 changed files with 19 additions and 21 deletions

View File

@ -65,6 +65,12 @@ public class ProgressLayout extends ConstraintLayout implements View.OnClickList
mMap.add(new LayoutProgressListener(progressKey)); mMap.add(new LayoutProgressListener(progressKey));
} }
public void cleanUpObservers() {
for(LayoutProgressListener progressListener : mMap) {
ProgressKeeper.removeListener(progressListener.progressKey, progressListener);
}
}
public boolean hasProcesses(){ public boolean hasProcesses(){
return ProgressKeeper.getTaskCount() > 0; return ProgressKeeper.getTaskCount() > 0;
} }

View File

@ -190,6 +190,7 @@ public class LauncherActivity extends BaseActivity {
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
mProgressLayout.cleanUpObservers();
ProgressKeeper.removeTaskCountListener(mProgressLayout); ProgressKeeper.removeTaskCountListener(mProgressLayout);
ProgressKeeper.removeTaskCountListener(mProgressServiceKeeper); ProgressKeeper.removeTaskCountListener(mProgressServiceKeeper);
ExtraCore.removeExtraListenerFromValue(ExtraConstants.BACK_PREFERENCE, mBackPreferenceListener); ExtraCore.removeExtraListenerFromValue(ExtraConstants.BACK_PREFERENCE, mBackPreferenceListener);

View File

@ -2,14 +2,12 @@ package net.kdt.pojavlaunch.progresskeeper;
import android.util.Log; import android.util.Log;
import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
public class ProgressKeeper { public class ProgressKeeper {
private static final ConcurrentHashMap<String, ConcurrentLinkedQueue<WeakReference<ProgressListener>>> sProgressListeners = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, ConcurrentLinkedQueue<ProgressListener>> sProgressListeners = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<String, ProgressState> sProgressStates = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, ProgressState> sProgressStates = new ConcurrentHashMap<>();
private static final ArrayList<TaskCountListener> sTaskCountListeners = new ArrayList<>(); private static final ArrayList<TaskCountListener> sTaskCountListeners = new ArrayList<>();
@ -32,19 +30,13 @@ public class ProgressKeeper {
} }
Log.d("ProgressLayout", "shouldCallStarted="+shouldCallStarted+" shouldCallEnded="+shouldCallEnded); Log.d("ProgressLayout", "shouldCallStarted="+shouldCallStarted+" shouldCallEnded="+shouldCallEnded);
ConcurrentLinkedQueue<WeakReference<ProgressListener>> listenerWeakReferenceList = sProgressListeners.get(progressRecord); ConcurrentLinkedQueue<ProgressListener> progressListeners = sProgressListeners.get(progressRecord);
if(listenerWeakReferenceList != null) { if(progressListeners != null)
Iterator<WeakReference<ProgressListener>> iterator = listenerWeakReferenceList.iterator(); for(ProgressListener listener : progressListeners) {
while(iterator.hasNext()) {
ProgressListener listener = iterator.next().get();
Log.i("ProgressLayout", listener+"");
if(listener != null) {
if(shouldCallStarted) listener.onProgressStarted(); if(shouldCallStarted) listener.onProgressStarted();
else if(shouldCallEnded) listener.onProgressEnded(); else if(shouldCallEnded) listener.onProgressEnded();
else listener.onProgressUpdated(progress, resid, va); else listener.onProgressUpdated(progress, resid, va);
} else iterator.remove();
} }
}
} }
private static void updateTaskCount() { private static void updateTaskCount() {
@ -59,20 +51,19 @@ public class ProgressKeeper {
if(state != null && (state.resid != -1 || state.progress != -1)) { if(state != null && (state.resid != -1 || state.progress != -1)) {
listener.onProgressStarted(); listener.onProgressStarted();
listener.onProgressUpdated(state.progress, state.resid, state.varArg); listener.onProgressUpdated(state.progress, state.resid, state.varArg);
Log.d("ProgressLayout", "Resubmitting UI state");
}else{ }else{
listener.onProgressEnded(); listener.onProgressEnded();
} }
ConcurrentLinkedQueue<WeakReference<ProgressListener>> listenerWeakReferenceList = sProgressListeners.get(progressRecord); ConcurrentLinkedQueue<ProgressListener> listenerWeakReferenceList = sProgressListeners.get(progressRecord);
if(listenerWeakReferenceList == null) sProgressListeners.put(progressRecord, (listenerWeakReferenceList = new ConcurrentLinkedQueue<>())); if(listenerWeakReferenceList == null) sProgressListeners.put(progressRecord, (listenerWeakReferenceList = new ConcurrentLinkedQueue<>()));
else { listenerWeakReferenceList.add(listener);
Iterator<WeakReference<ProgressListener>> iterator = listenerWeakReferenceList.iterator();
while(iterator.hasNext()) {
if(iterator.next().get() == null) iterator.remove();
}
}
listenerWeakReferenceList.add(new WeakReference<>(listener));
} }
public static void removeListener(String progressRecord, ProgressListener listener) {
ConcurrentLinkedQueue<ProgressListener> listenerWeakReferenceList = sProgressListeners.get(progressRecord);
if(listenerWeakReferenceList != null) listenerWeakReferenceList.remove(listener);
}
public static void addTaskCountListener(TaskCountListener listener) { public static void addTaskCountListener(TaskCountListener listener) {
listener.onUpdateTaskCount(sProgressStates.size()); listener.onUpdateTaskCount(sProgressStates.size());
if(!sTaskCountListeners.contains(listener)) sTaskCountListeners.add(listener); if(!sTaskCountListeners.contains(listener)) sTaskCountListeners.add(listener);