如何在Android中使用intentservice同时下载多个文件?

我想创建一个类似于这个的服务(从这里引用),以便在Android中异步下载多个文件。

public static class DownloadingService extends IntentService { public static String PROGRESS_UPDATE_ACTION = DownloadingService.class .getName() + ".newDownloadTask"; private ExecutorService mExec; private CompletionService mEcs; private LocalBroadcastManager mBroadcastManager; private List mTasks; public DownloadingService() { super("DownloadingService"); mExec = Executors.newFixedThreadPool( 3 ); // The reason to use multiple thread is to download files asynchronously. mEcs = new ExecutorCompletionService(mExec); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override protected void onHandleIntent(Intent intent) { while(true) { if( cursor <= totalDownloadQueue.size() -1) { //totalDownloadQueue is a static ArrayList which contains numerous DownloadTask mEcs.submit(totalDownloadQueue.get(cursor)); cursor++; // The variable cursor is also a static int variable. } }// continuously observing the totalDownloadQueue. If any download item is added. Then the thread are dispatched to handle that. mExec.shutdown(); } 

用户可以在不同的片段中选择listview中的下载项。 我的策略是,当用户选择项目并按下载按钮时,这些项目将被传递到DownloadTask ,后者负责下载文件。 然后将下载任务添加到totalDownloadQueue

以下是一些问题:

  1. 我知道intentservice是由一些定义的动作触发的。 但我想要的是创建一个观看totalDownloadQueue的后台服务,如果有任何新的downloadtask任务totalDownloadQueue ,则调用一些线程来操作任务。

    如果我为这个定制的intentservice这样做intentservice什么intentservice

    我应该使用哪种替代课程? 请提供sample code以及说明,谢谢。

  2. 据我所知,线程的初始化只被调用一次。 如果我在应用程序开始时启动服务,并且应该在用户终止应用程序时终止线程。(我的意思是当他swipe out窗口时。)用户退出应用程序后是否存在线程?

  3. 如果这种方法仍然无法解决异步下载文件的问题? 我应采取什么其他策略? 请提供一些示例代码或参考,以便我可以对其进行修改。

我花了7天时间处理复杂的要求,请帮忙!

在Android中异步下载多个文件。

而且我想你想同时下载。

我认为你滥用了intentserviceintentservice有一个intentservice looper和一个handler ,每次启动调用都会导致为处理程序创建一个消息。 所有消息都在looper queue中排队,并一次提供一个消息。

你应该使用普通服务,不要使用intentservice因为你想同时下载一个而不是一个。 扩展服务类,在onCreate方法中,您可以创建多个线程,每个线程都可以从onStartCommand获取消息。 我不想复制和粘贴文档示例,因为我认为最好再次阅读所有文档。 如果您阅读它,您可以完全理解如何创建同时处理多个任务的服务,尽管它在示例中只创建了一个线程。

http://developer.android.com/guide/components/services.html

我想要的是创建一个观看totalDownloadQueue的后台服务

我想你不需要那个。 就在您创建downloadtask调用服务时,您的message将传递给服务类,在该类中,您可以创建blockingqueue以通过threads处理您的消息。

用户退出应用程序后是否存在线程?

是的,也许不是。 它取决于进程,如果进程存在肯定但是进程已被销毁否。 再次读取进程的lifecycle ,以了解android杀死或保留的进程。

http://developer.android.com/guide/components/processes-and-threads.html

如果这种方法仍然无法解决异步下载文件的问题? 我应采取什么其他策略? 请提供一些示例代码或参考,以便我可以对其进行修改。

你可以使用downloadmanager但它会顺序下载。

http://developer.android.com/reference/android/app/DownloadManager.html

http://blog.vogella.com/2011/06/14/android-downloadmanager-example/

IntenServiceAsyncTask提供单个工作线程,因此无法同时下载多个图像。 但是,我强烈建议ThreadPoolExecutor满足您的要求。 它基本上创建了一个线程池,根据您应用的任务数量或要下载的文件数量来扩展/收缩。 THreadPoolExecutor处理线程管理的每个方面,并且非常有效。 使用此代码示例中的as创建单个执行程序:

 ExecutorService tpExecutor= new ThreadPoolExecutor( coreSize, // the basic number of threads, when a task is added to the queue // a new thread is created if nrOfThreads < coreSize maxPoolSize, // maximum number of threads created keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue() ); 

您可以通过执行runnables提交多个下载任务:

 tpExecutor.execute(new Runnable()); 

从它的声音中你可以从使用ASyncTask中的onProgressUpdate方法中受益 ,它可以让你随时了解最新进展。 也许通过课程描述阅读 – 听起来就像你需要的那样。 它还附带了大量的示例代码!

希望我有所帮助!