用户可以添加任意数量的下载,但下载将一个接一个地开始,即下次下载将仅在当前下载完成后开始。用户将离开显示下载进度的活动以添加新的下载,并且当添加要下载的新文件时,应用程序导航回显示下载进度的活动,其中将显示下载的进度,之前添加,并将当前添加的文件保留为挂起下载。下载完成后,挂起的下载将立即开始下载。 通过这种方式,用户可以添加任意数量的下载,并且它们将一个接一个地开始。我想在后台连续下载它们 - 一个接一个。我想在ListView中显示进度和状态。所以,ListView看起来像:
File1 ...正在进行中说39%
文件2 ....待定
File3 ...待定
File4 ...待定
答案 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”可以是您选择的任何其他字符串。
借来的示例代码