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));
}
public void cleanUpObservers() {
for(LayoutProgressListener progressListener : mMap) {
ProgressKeeper.removeListener(progressListener.progressKey, progressListener);
}
}
public boolean hasProcesses(){
return ProgressKeeper.getTaskCount() > 0;
}

View File

@ -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);

View File

@ -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<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 ArrayList<TaskCountListener> sTaskCountListeners = new ArrayList<>();
@ -32,18 +30,12 @@ public class ProgressKeeper {
}
Log.d("ProgressLayout", "shouldCallStarted="+shouldCallStarted+" shouldCallEnded="+shouldCallEnded);
ConcurrentLinkedQueue<WeakReference<ProgressListener>> listenerWeakReferenceList = sProgressListeners.get(progressRecord);
if(listenerWeakReferenceList != null) {
Iterator<WeakReference<ProgressListener>> iterator = listenerWeakReferenceList.iterator();
while(iterator.hasNext()) {
ProgressListener listener = iterator.next().get();
Log.i("ProgressLayout", listener+"");
if(listener != null) {
ConcurrentLinkedQueue<ProgressListener> 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();
}
}
}
@ -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<WeakReference<ProgressListener>> listenerWeakReferenceList = sProgressListeners.get(progressRecord);
ConcurrentLinkedQueue<ProgressListener> listenerWeakReferenceList = sProgressListeners.get(progressRecord);
if(listenerWeakReferenceList == null) sProgressListeners.put(progressRecord, (listenerWeakReferenceList = new ConcurrentLinkedQueue<>()));
else {
Iterator<WeakReference<ProgressListener>> iterator = listenerWeakReferenceList.iterator();
while(iterator.hasNext()) {
if(iterator.next().get() == null) iterator.remove();
listenerWeakReferenceList.add(listener);
}
public static void removeListener(String progressRecord, ProgressListener listener) {
ConcurrentLinkedQueue<ProgressListener> listenerWeakReferenceList = sProgressListeners.get(progressRecord);
if(listenerWeakReferenceList != null) listenerWeakReferenceList.remove(listener);
}
listenerWeakReferenceList.add(new WeakReference<>(listener));
}
public static void addTaskCountListener(TaskCountListener listener) {
listener.onUpdateTaskCount(sProgressStates.size());
if(!sTaskCountListeners.contains(listener)) sTaskCountListeners.add(listener);