Android Загрузка нескольких файлов один за другим и отображение прогресса в ListView

Пользователь может добавить любое количество загрузок, но загрузки будут запускаться одна за другой, т.е. следующая загрузка начнется только после завершения текущей загрузки. Пользователь перейдет от действия, показывающего ход загрузки, чтобы добавить новые загрузки, а когда будет добавлен новый файл для загрузки, приложение вернется к действию, показывающему ход загрузки, где оно покажет ход загрузки, ранее добавлен, и сохранить добавленный файл как ожидающий загрузки. Как только загрузка завершится, начнется загрузка отложенной загрузки. Таким образом пользователь может добавить любое количество загрузок, и они будут запускаться одна за другой. Я хочу загрузить их последовательно в фоновом режиме - один за другим. Я хочу показать прогресс и статус в ListView. Итак, ListView выглядит так:

File1 ...в процессе говорят 39%

Файл2.... Ожидание

Файл3... В ожидании

Файл4... В ожидании


person user2416657    schedule 10.10.2013    source источник
comment
подумываю об использовании AsyncTask, но не знаю, как запустить индикатор выполнения для следующей ожидающей загрузки после завершения текущей загрузки. А также как обновлять индикатор выполнения, когда пользователь переходит к другому действию, чтобы добавить новую загрузку.   -  person user2416657    schedule 10.10.2013


Ответы (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

Вы можете использовать его так в своей деятельности:

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
comment
Не могли бы вы дать дополнительную информацию о CallbackString? Что это на самом деле и как я должен его использовать? - person Hoang Trinh; 27.06.2014
comment
Доброе напоминание! IntentService устарел в API 30. - person Khay Leang; 13.06.2021