我建议使用 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");
}
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){
Intent i = new Intent(context, FileDownloader.class);
i.putExtra("Path", folderpath);
i.putExtra("Filename", filename);
i.putExtra("CallbackString",
"progress_callback");
startService(i);
IntentFilter filter = new IntentFilter("progress_callback");
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle b = intent.getExtras();
String filepath = b.getString("Filepath");
int progress = b.getInt("Progress");
}
}
registerReceiver(receiver, filter);
}
请在
onDestroy
方法中运行此代码:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
请注意,“progress_callback”可以是您选择的任何其他字符串。
示例代码来自
以编程方式注册广播接收器。