я предложил бы использовать 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» обратным вызовом, как вы бы с любыми другими передачами, регистрируя приемник и т.д. В этом примере, используя FilePath, чтобы определить, какой файл должен иметь это прогресс визуального обновленный ,
Не забудьте зарегистрировать услугу в манифесте.
<service android:name="yourpackage.FileDownloader" />
Примечание:
С помощью этого решения вы можете запустить услугу для каждого файла сразу и случайно обрабатывать входящие передач, как каждая служба сообщает новый прогресс. Не нужно ждать, пока каждый файл будет загружен до начала следующего. Но если вы настаиваете на загрузке файлов в серийном режиме, вы можете, конечно, дождаться 100% -ных обратных вызовов прогресса перед вызовом следующего.
Использование 'CallbackString'
Вы можете использовать его, как это в вашей деятельности:
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
думать об использовании AsyncTask, но не знаю, как начать прогресс бар для следующего ожидающего загрузки после того, как настоящее загрузка завершена. А также как обновить индикатор выполнения, как только пользователь перейдет к другому действию, чтобы добавить новую загрузку. – user2416657