package com.netease.nim.demo.common.infra;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
public class TaskManagerRegistry {
private static List<WeakReference<TaskManager>> managers = new ArrayList<WeakReference<TaskManager>>();
public static void register(TaskManager manager) {
synchronized (managers) {
managers.add(new WeakReference<TaskManager>(manager));
}
}
public static void waitAll(final Context context, final Runnable done, final int max, final int interval) {
cancelAll(true);
com.netease.nim.demo.common.infra.Handlers.sharedHandler(context).postDelayed(new Runnable() {
int count;
@Override
public void run() {
if (!idle() && count++ < max) {
com.netease.nim.demo.common.infra.Handlers.sharedHandler(context).postDelayed(this, interval);
} else {
done.run();
}
}
}, interval);
}
private static void cancelAll(boolean clear) {
synchronized (managers) {
for (int i = 0; i < managers.size(); ++i) {
TaskManager manager = managers.get(i).get();
if (manager != null) {
manager.shutdown();
} else {
managers.remove(i--);
}
}
if (clear) {
managers.clear();
}
}
}
private static boolean idle() {
synchronized (managers) {
for (int i = 0; i < managers.size(); ++i) {
TaskManager manager = managers.get(i).get();
if (manager != null) {
if (manager.count() > 0) {
return false;
}
} else {
managers.remove(i--);
}
}
}
return true;
}
}