如何在Android

时间:2017-02-10 06:56:47

标签: android service download

我有一个活动,它有两个listview。第一个listview有音乐。第二个列表视图显示下载项目,每个下载项目显示下载百分比的进度条。 如果用户单击音乐项,我将下载项添加到第二个列表视图并使用AsyncTask启动下载文件。用户可以点击多个音乐,这意味着同时下载多个文件。 我可以使用AsyncTask下载文件。但我想下载服务中的文件,因为下载必须继续,甚至应用程序关闭。

我不知道如何通过服务同时下载多个文件。我应该遵循哪些步骤?有没有这方面的教程?

3 个答案:

答案 0 :(得分:7)

我在我的一个制作应用程序中实现了相同的功能:

  1. 创建表格以添加要下载的项目。排序应基于添加项目以供下载的时间。将此视为队列。还要添加一列以检查文件是否已下载。如果已下载,请将其从队列中删除。
  2. 创建一个IntentService,即使应用程序已关闭,它也将负责在后台下载数据。这个Service应该一直运行,直到表队列不为空。它应该仅在添加新项目时启动,或者当网络连接状态从无效更改为实时时启动。在此Service中,您应该检查队列是否为空。如果从表中清空提取 N 行数,则添加到队列(ExecutorService)中以供下载。要检查网络状态的数量,请使用BroadcastReceiver创建‎LocalBroadcastManager
  3. 现在您可以在 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
    }
    }
    
  4. 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个不同的网址同时下载。