Ich denke, AsyncTask wird dafür geeignet sein. Sie können zwei Warteschlangen namens runningTasks und pendingTasks erstellen.
Immer wenn Sie versuchen, eine Aufgabe herunterzuladen, legen Sie sie in die runningTasks-Liste und andere Aufgaben in der pendantTasks-Liste ab. Führen Sie die in der Liste der ausgeführten Aufgaben hinzugefügten Aufgaben mithilfe des AsyncTask-Handlers aus. Fügen Sie einen Listener hinzu, wenn eine Aufgabe abgeschlossen wird. Entfernen Sie eine Aufgabe aus pendantTasks, und fügen Sie sie in die pendantTasks-Liste ein. Siehe Logic Implmented Unten: -
public class Downloader
{
AsyncTaskScheduler scheduler;
public Downloader()
{
scheduler = new AsyncTaskScheduler();
}
public void startDownload()
{
long ts = System.currentTimeMillis();
YourAsyncTask handler = new YourAsyncTask();
scheduler.schedule(handler, ts);
}
}
public class YourAsyncTask extends AsyncTask<Void, Void, Bitmap>
{
AsyncTaskScheduler listener;
String Uri;
public YourAsyncTask(AsyncTaskScheduler listener, uri)
{
this.Uri = uri;
this.listener = listener;
}
@Override
protected Bitmap doInBackground(Void... params)
{
try {
//Do Http Download here from The URI
// return the Bitmap downloaded ;
return bitmap;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap)
{
this.listener.DownloadCompleted(this);
}
}
public class TaskInfo
{
AsyncTask< Void , Void, Bitmap> async;
long timeStamp;
public TaskInfo(){}
public TaskInfo(AsyncTask< Void , Void, Bitmap> async, long timeStamp)
{
this.async = async;
this.timeStamp = timeStamp;
}
public AsyncTask<Void, Void, Bitmap> getHandler()
{
return this.async;
}
public long getTimeStamp()
{
return this.timeStamp;
}
}
public interface DownloaderCompleted
{
void DownloadCompleted(AsyncTask<Void, Void, Bitmap> task);
}
public class AsyncTaskScheduler implements DownloaderCompleted
{
private static final int RUNNING_TASK_LIST_SIZE = 3;
public ArrayList<TaskInfo> runningTasks;
public LinkedList<TaskInfo> pendingTasks;
public AsyncTaskScheduler()
{
runningTasks = new ArrayList<TaskInfo>();
pendingTasks = new LinkedList<TaskInfo>();
}
public void schedule(AsyncTask<Void, Void, Bitmap> handler, long timeStamp)
{
//Running Task list is not Full add some task to it
TaskInfo taskInfo = new TaskInfo(handler,timeStamp);
if (!isRunningtaskListFull())
{
runningTasks.add(taskInfo);
//Check if the task added to the running list , is there in the pending list also , then remove it.
for(int i = 0; i< pendingTasks.size();i++)
{
if (pendingTasks.get(i).getVideoId().equals(videoId))
{
pendingTasks.remove(i);
break;
}
}
taskInfo.getHandler().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else
{
//Check if the task is in the pending list , if Yes then No Need to Add it.
boolean found = false;
for(int i = 0; i< pendingTasks.size();i++)
{
if (pendingTasks.get(i).getVideoId().equals(videoId))
{
found = true;
break;
}
}
if (found == false)
{
pendingTasks.addFirst(taskInfo);
}
}
}
public boolean isRunningtaskListFull()
{
if (runningTasks.size() == RUNNING_TASK_LIST_SIZE)
return true;
else
return false;
}
@Override
public void DownloadCompleted(AsyncTask<Void, Void, Bitmap> handler)
{
//check the task in the running list and remove .
boolean found = false;
for (int i = 0; i < runningTasks.size(); i++)
{
if (runningTasks.get(i).getHandler().equals(handler))
{
runningTasks.remove(i);
found = true;
break;
}
}
if (found == true)
{
if (pendingTasks.size() > 0)
{
TaskInfo taskInfo = pendingTasks.removeFirst();
schedule(taskInfo.getHandler(), taskInfo.getTimeStamp());
} else
{
//All Tasks Downloaded
}
}
}
}
Vielleicht Downloadmanager für Sie geeignet ist: https://developer.android.com/reference/android/app/DownloadManager.html – Christopher
Verwendung _DownloadManager_ – Piyush