Я бы предложил использовать 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
Вы можете использовать его так в своей деятельности:
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» может быть любой другой строкой по вашему выбору.
Пример кода, заимствованный из Программная регистрация широковещательного приемника
person
cYrixmorten
schedule
10.10.2013