package org.aisen.wen.component.network.task; import android.os.Bundle; import android.text.TextUtils; import org.aisen.wen.support.utils.Logger; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Set; public class TaskManager implements ITaskManager { static final String TAG = "TaskManager"; private LinkedHashMap<String, WeakReference<IWorkTask>> taskCache; private HashMap<String, Integer> taskCountMap; public TaskManager() { taskCountMap = new HashMap<>(); taskCache = new LinkedHashMap<>(); } @Override public void addTask(IWorkTask task) { if (task != null && !TextUtils.isEmpty(task.getTaskId())) { int count = taskCountMap.keySet().contains(task.getTaskId()) ? taskCountMap.get(task.getTaskId()) : 0; taskCountMap.put(task.getTaskId(), ++count); cancelExistTask(task.getTaskId(), true); taskCache.put(task.getTaskId(), new WeakReference<>(task)); Logger.d(TAG, String.format("addTask() --->%s", task.getTaskId())); } } @Override public void removeTask(String taskId, boolean cancelIfRunning) { cancelExistTask(taskId, cancelIfRunning); } @Override public void removeAllTask(boolean mayInterruptIfRunning) { Set<String> keySet = taskCache.keySet(); for (String key : keySet) { IWorkTask task = getTaskById(key); if (task != null) task.cancel(mayInterruptIfRunning); } taskCache.clear(); } private void cancelExistTask(String taskId, boolean mayInterruptIfRunning) { IWorkTask existTask = getTaskById(taskId); if (existTask != null) Logger.d(TAG, String.format("interrupt exist task --->%s", taskId)); if (existTask != null) existTask.cancel(mayInterruptIfRunning); taskCache.remove(taskId); } private IWorkTask getTaskById(String taskId) { WeakReference<IWorkTask> existTaskRef = taskCache.get(taskId); if (existTaskRef != null) return existTaskRef.get(); return null; } @Override public int getTaskCount(String taskId) { if(TextUtils.isEmpty(taskId)) return 0; return taskCountMap.keySet().contains(taskId) ? taskCountMap.get(taskId) : 0; } public void clearTaskCount(String taskId) { if(!TextUtils.isEmpty(taskId)) taskCountMap.remove(taskId); } public void save(Bundle outState) { outState.putSerializable("map", taskCountMap); } public void restore(Bundle savedInstanceState) { if (savedInstanceState != null && savedInstanceState.getSerializable("map") != null) { taskCountMap = (HashMap<String, Integer>) savedInstanceState.getSerializable("map"); } } }