mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-17 08:35:37 -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));
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user