2016-08-29 7 views
0

Ich möchte eine Reihe von Dateien gleichzeitig in Android herunterladen, zum Beispiel gibt es 10000 Dateien heruntergeladen werden, jede Datei haben kleine Größe von etwa 20kb, und ich möchte 3 Threads gleichzeitig herunterladen die Dateien.Wie viele Dateien gleichzeitig in Android herunterladen?

Vielleicht ist Asynctask geeignet? Und möglicherweise wird eine Warteschlange benötigt, um die 10000 URLs zu verwalten?

Es sind einige Kommentare erwähnt DownloadManager.class, unterstützt es den gleichzeitigen Download? Da es zu viele Dateien gibt und die Dateigröße klein ist, denke ich, dass es gleichzeitig schneller geht.

+2

Vielleicht Downloadmanager für Sie geeignet ist: https://developer.android.com/reference/android/app/DownloadManager.html – Christopher

+0

Verwendung _DownloadManager_ – Piyush

Antwort

0

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
   
        }
   
       }
   
     }
   
    }
   
Verwandte Themen