package com.steamcommunity.siplus.steamscreenshots; import java.util.Iterator; import java.util.LinkedList; import android.os.AsyncTask; public abstract class AsyncTaskWithRunID extends AsyncTask<Void, Integer, Boolean> { static int mNextRun; int mRun; static LinkedList<AsyncTaskWithRunID> mRuns = new LinkedList<AsyncTaskWithRunID>(); static AsyncTaskWithRunID findRun(int run) { if (run <= 0) { return null; } Iterator<AsyncTaskWithRunID> iterator; AsyncTaskWithRunID task; for (iterator = mRuns.iterator(); iterator.hasNext(); ) { task = iterator.next(); if (task.mRun == run) { return task; } } return null; } static boolean isRunning(AsyncTaskWithRunID task) { return (task != null) && (task.mRun > 0); } @Override protected void onCancelled(Boolean result) { removeSelfFromRunsList(); onCancelledWithRunID(result); } @Override protected void onPostExecute(Boolean result) { removeSelfFromRunsList(); onPostExecuteWithRunID(result); } @Override protected void onPreExecute() { mRun = (mNextRun++) + 1; mNextRun &= 0x3fffffff; mRuns.add(this); onPreExecuteWithRunID(); } void removeSelfFromRunsList() { int oldRun = mRun; mRun = 0; Iterator<AsyncTaskWithRunID> iterator; for (iterator = mRuns.iterator(); iterator.hasNext(); ) { if (iterator.next().mRun == oldRun) { iterator.remove(); return; } } } abstract void onCancelledWithRunID(boolean result); abstract void onPostExecuteWithRunID(boolean result); abstract void onPreExecuteWithRunID(); }