我想创建一个与此类似的服务(来自Here的引用),以便在Android中异步下载多个文件。
public static class DownloadingService extends IntentService {
public static String PROGRESS_UPDATE_ACTION = DownloadingService.class
.getName() + ".newDownloadTask";
private ExecutorService mExec;
private CompletionService<NoResultType> mEcs;
private LocalBroadcastManager mBroadcastManager;
private List<DownloadTask> mTasks;
public DownloadingService() {
super("DownloadingService");
mExec = Executors.newFixedThreadPool( 3 ); // The reason to use multiple thread is to download files asynchronously.
mEcs = new ExecutorCompletionService<NoResultType>(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
中。
以下是一些问题:
我知道intentservice
是由某些已定义的操作触发的。但我想要的是创建一个观察totalDownloadQueue
的后台服务,如果有新的downloadtask
可用,则会调用一些线程来操作任务。
如果我为这个自定义的intentservice
这样做会产生什么副作用?
我应该使用哪种替代课程?请提供sample code
以及解释,谢谢。
据我所知,线程的初始化只被调用一次。如果我在应用程序开始时启动服务,并且应该在用户终止应用程序时终止线程。(我的意思是当他swipe out
窗口时。)用户退出应用程序后是否存在线程?< / p>
如果这种方法仍无法解决异步下载文件的问题?我应该采取什么其他策略? 请提供一些示例代码或参考,以便我可以对其进行修改。
我花了7天时间处理复杂的要求,请帮忙!
答案 0 :(得分:11)
在Android中异步下载多个文件。
我想你也想同时下载。
我认为你误用了intentservice
。 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/
答案 1 :(得分:2)
IntenService
和AsyncTask
提供单个工作线程,因此无法同时下载多个图像。但是,我强烈建议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<Runnable>()
);
您可以通过执行runnables提交多个下载任务:
tpExecutor.execute(new Runnable());
答案 2 :(得分:0)
从它的声音中,您可以使用onProgressUpdate中的ASyncTask方法获益,这可以让您随时了解最新进展。也许通过课程描述阅读 - 听起来就像你需要的那样。它还附带了大量的示例代码!
希望我有所帮助!