mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-16 08:05:34 -04:00
No more weak reference hell in ProgressKeeper
This commit is contained in:
parent
a8e864ac3d
commit
61b72c089c
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user