我有一个活动,它有两个listview。第一个listview有音乐。第二个列表视图显示下载项目,每个下载项目显示下载百分比的进度条。 如果用户单击音乐项,我将下载项添加到第二个列表视图并使用AsyncTask启动下载文件。用户可以点击多个音乐,这意味着同时下载多个文件。 我可以使用AsyncTask下载文件。但我想下载服务中的文件,因为下载必须继续,甚至应用程序关闭。
我不知道如何通过服务同时下载多个文件。我应该遵循哪些步骤?有没有这方面的教程?
答案 0 :(得分:7)
我在我的一个制作应用程序中实现了相同的功能:
IntentService
,即使应用程序已关闭,它也将负责在后台下载数据。这个Service
应该一直运行,直到表队列不为空。它应该仅在添加新项目时启动,或者当网络连接状态从无效更改为实时时启动。在此Service
中,您应该检查队列是否为空。如果从表中清空提取 N 行数,则添加到队列(ExecutorService
)中以供下载。要检查网络状态的数量,请使用BroadcastReceiver
创建LocalBroadcastManager
。现在您可以在 DownloadIntentService 中编写代码。尝试根据您的需要进行修改:
private static int NUMBER_OF_CORES =
Runtime.getRuntime().availableProcessors() * 2;
private final ExecutorService executorService;
private final ExecutorCompletionService<DownloadModel> executorCompletionService;
public DownloadIntentService() {
super("DownloadIntentService");
executorService = Executors.newFixedThreadPool(NUMBER_OF_CORES);
executorCompletionService = new ExecutorCompletionService<>(executorService);
}
......
@Override
protected void onHandleIntent(Intent intent) {
//Check to see for storage permission
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
.....
//Now create job queue
....
//Fetch rows to download from table
DownloadQuery downloadQuery = new DownloadQuery(DownloadIntentService.this);
ArrayList<DownloadModel> downloadModelArrayList = downloadQuery.getDownload(DownloadContract.IFileDownloadStatus.NOT_DOWNLOADED,
0, NUMBER_OF_CORES);
//Check if queue contains any item
if (downloadModelArrayList.size() > 0) {
if (!executorService.isShutdown())
executorCompletionService.submit(new DownloadWorkerCallable(**Your download model from table to download**, DownloadIntentService.this));
}
.....
//Don't forget to shutdown the executorService
}
}
此DownloadWorkerCallable
正在实施Runnable
实际下载文件。
答案 1 :(得分:2)
您应该使用ThreadPool或更好的EventBus。 AsyncTask不是多次下载的好选择。
答案 2 :(得分:0)
这对你有帮助。你在android中有 executeOnExecutor
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void StartAsyncTaskInParallel(MyAsyncTask task) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
task.execute();
}
了解更多详情 http://android-er.blogspot.in/2014/04/run-multi-asynctask-as-same-time.html
您可以使用5-6个不同的网址同时下载。