Android一个接一个地下载多个文件并在ListView中显示进度

时间:2013-10-10 09:03:55

标签: android android-listview android-asynctask intentservice android-download-manager

用户可以添加任意数量的下载,但下载将一个接一个地开始,即下次下载将仅在当前下载完成后开始。用户将离开显示下载进度的活动以添加新的下载,并且当添加要下载的新文件时,应用程序导航回显示下载进度的活动,其中将显示下载的进度,之前添加,并将当前添加的文件保留为挂起下载。下载完成后,挂起的下载将立即开始下载。 通过这种方式,用户可以添加任意数量的下载,并且它们将一个接一个地开始。我想在后台连续下载它们 - 一个接一个。我想在ListView中显示进度和状态。所以,ListView看起来像:

File1 ...正在进行中说39%

文件2 ....待定

File3 ...待定

File4 ...待定

1 个答案:

答案 0 :(得分:1)

我建议使用IntentServices:

public class FileDownloader extends IntentService {

private static final String TAG = FileDownloader.class.getName();



public FileDownloader() {
    super("FileDownloader");
}

@Override
protected void onHandleIntent(Intent intent) {
    String fileName = intent.getStringExtra("Filename");
    String folderPath = intent.getStringExtra("Path");
    String callBackIntent = intent
            .getStringExtra("CallbackString");

     // Code for downloading

     // When you want to update progress call the sendCallback method

}

private void sendCallback(String CallbackString, String path,
        int progress) {

        Intent i = new Intent(callBackIntent);
        i.putExtra("Filepath", path);
        i.putExtra("Progress", progress);
        sendBroadcast(i);

}

}

然后开始下载文件,只需执行以下操作:

Intent i = new Intent(context, FileDownloader.class);
i.putExtra("Path", folderpath);
i.putExtra("Filename", filename);
i.putExtra("CallbackString",
            "progress_callback");
startService(i);

现在您应该像处理任何其他广播一样处理“progress_callback”回调,注册接收器等。在此示例中,使用文件路径确定哪个文件的进度可视化更新。

不要忘记在清单中注册服务。

 <service android:name="yourpackage.FileDownloader" />

注意:

使用此解决方案,您可以立即为每个文件启动服务,并在每个服务报告新进度时随意处理传入的广播。在开始下一个文件之前无需等待下载每个文件。但是如果你坚持按顺序下载文件,当然可以在调用下一个之前等待100%的进度回调。

使用'CallbackString'

你可以在你的Activity中使用它:

private BroadcastReceiver receiver;

@Overrride
public void onCreate(Bundle savedInstanceState){

  // your oncreate code

  // starting the download service

  Intent i = new Intent(context, FileDownloader.class);
  i.putExtra("Path", folderpath);
  i.putExtra("Filename", filename);
  i.putExtra("CallbackString",
            "progress_callback");
  startService(i);

  // register a receiver for callbacks 
  IntentFilter filter = new IntentFilter("progress_callback");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //do something based on the intent's action
      Bundle b = intent.getExtras();
      String filepath = b.getString("Filepath");
      int progress = b.getInt("Progress");
      // could be used to update a progress bar or show info somewhere in the Activity
    }
  }
  registerReceiver(receiver, filter);
}

请记住在onDestroy方法中运行:

@Override
protected void onDestroy() {
  super.onDestroy();
  unregisterReceiver(receiver);
}

请注意,“progress_callback”可以是您选择的任何其他字符串。

Programmatically register a broadcast receiver

借来的示例代码