我想创建一项与此类似的服务(参考来自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
窗口。)用户退出应用程序后线程是否存在?
如果这样还是不能解决异步下载文件的问题吗?我还应该采取什么其他策略?
请提供一些示例代码或参考,以便我可以对其进行修改。
我花了7天时间处理这个复杂的需求,请帮忙!
在 Android 中异步下载多个文件。
而且我认为你想同时下载。
我认为你滥用了intentservice
. intentservice
has a looper
and a handler
每次调用 start 都会为处理程序创建一条消息。所有消息都在队列中looper queue
并一次提供一份。
您应该使用正常服务并且不要使用intentservice
因为你想同时下载而不是一次下载一个。延长服务等级并在onCreate
您可以创建多个线程的方法,每个线程都可以从中获取消息onStartCommand
。我不想复制并粘贴文档示例,因为我认为最好再次阅读所有文档。如果您阅读它,您可以完全理解如何创建同时处理多个任务的服务,尽管它在示例中只创建了一个线程。
http://developer.android.com/guide/components/services.html
我想要的是创建一个后台服务来监视
总下载队列
我认为你不需要那个。就在你创建的时候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/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)