Ответ 1
В принципе вы можете использовать AsyncTask, с помощью которого вы могли бы достичь вышеуказанного, если загрузка строго привязана к активности. Однако AsyncTask необходимо должным образом отменить, как только пользователь отменит или отменит действие. Также он обеспечивает базовый механизм для достижения прогресса.
Например, представьте себе простую задачу async (не лучшая реализация), но что-то вроде ниже
class SearchAsyncTask extends AsyncTask<String, Void, Void> {
SearchHttpClient searchHttpClient = null;
public SearchAsyncTask(SearchHttpClient client) {
searchHttpClient = client;
}
@Override
protected void onProgressUpdate(Void... values) {
// You can update the progress on dialog here
super.onProgressUpdate(values);
}
@Override
protected void onCancelled() {
// Cancel the http downloading here
super.onCancelled();
}
protected Void doInBackground(String... params) {
try {
// Perform http operation here
// publish progress using method publishProgress(values)
return null;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute() {
// If not cancelled then do UI work
}
}
Теперь в вашей деятельности onDestroy метод
@Override
protected void onDestroy() {
Log.d(TAG, "ResultListActivity onDestory called");
if (mSearchTask != null && mSearchTask.getStatus() != AsyncTask.Status.FINISHED) {
// This would not cancel downloading from httpClient
// we have do handle that manually in onCancelled event inside AsyncTask
mSearchTask.cancel(true);
mSearchTask = null;
}
super.onDestroy();
}
Однако, если вы разрешаете пользователю загружать файл даже независимо от активности (например, он продолжает загружаться, даже если пользователь ушел из Activity), я бы предложил использовать Сервис, который может делать материал в фоновом режиме.
UPDATE: просто заметил, что есть аналогичный ответ на Stackoverflow, который более подробно объясняет мои мысли Загружает файл с Android и показывает прогресс в ProgressDialog