Как дать прогрессбар для загрузки?

В моем приложении я загружаю видеофайл. Я хочу показать индикатор выполнения для загрузки.

Как это возможно с помощью концепции AsyncTask?

Спасибо,

Ники


person Niki    schedule 14.03.2011    source источник


Ответы (2)


Используйте метод onProgressUpdate для AsyncTask.

Если вы знаете размер файла, вы можете установить максимальное значение в onPreExecute:

protected void onPreExecute() {
  ProgressDialog myDialog = new ProgressDialog(context);
  myDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  myDialog.setMax(maxValue);
  myDialog.show();
}

РЕДАКТИРОВАТЬ: добавлен myDialog.show();

Существует несколько способов обновления хода выполнения, либо путем увеличения на сумму, либо путем установки определенного значения хода выполнения:

@Override
protected void onProgressUpdate(Integer... progress) {
  myDialog.incrementProgressBy(progress[0]);

  // or
  // myDialog.setProgress(progress[0]);

}

Затем в onDoInBackground():

@Override
protected void doInBackGround() {
  // your code
  publishProgress(1);
}

Пример РЕДАКТИРОВАТЬ с полосой прогресса в макете:

В вашем файле макета добавьте индикатор выполнения, подобный этому

<ProgressBar
    android:id="@+id/progressbar"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    style="?android:attr/progressBarStyleHorizontal"
    android:visibility="gone"
    />

И в вашей асинтаске:

protected void onPreExecute() {
  ProgressBar myProgress = findViewById(R.id.progressbar);
  myProgress.setMax(maxValue);
  myProgress.setVisibility(View.VISIBLE);
}

protected void onProgressUpdate(Integer... progress) {
  myProgress.setProgress(progress[0]);
}
person Eric Nordvik    schedule 14.03.2011
comment
@cantOna: Большое спасибо ... Но я не вижу индикатор выполнения в своей деятельности. - person Niki; 15.03.2011
comment
Извините, забыл добавить myDialog.show() в onPreExecute. Это была ошибка? - person Eric Nordvik; 15.03.2011
comment
@cantOna: Большое спасибо, yaar ... Могу ли я настроить положение этого индикатора выполнения и сделать его частью моего приложения, поскольку он остается в моих действиях до завершения загрузки. - person Niki; 15.03.2011
comment
Конечно. ProgressDialog — это только один пример. Вы можете добавить ProgressBar в свой файл макета, который вы показываете в onPreExecute, и запускать обновления в onProgressUpdate в качестве другого примера. - person Eric Nordvik; 15.03.2011
comment
@cantOna: Можешь объяснить?? Я попытался дать ему свой макет. Дело в том, что прогресса не видно. - person Niki; 16.03.2011

Сначала вам нужно рассчитать время загрузки, а затем реализовать индикатор выполнения в соответствии с ограничением по времени. здесь я приложил пример программы индикатора выполнения

new Thread(new Runnable() {
         public void run() {
             while (mProgressStatus < 100) {
                 mProgressStatus = doWork();

                 // Update the progress bar
                 mHandler.post(new Runnable() {
                     public void run() {
                         mProgress.setProgress(mProgressStatus);
                     }
                 });

И это код для расчета длины времени для загрузки файла

//once the connection has been opened              

List values = urlConnection.getHeaderFields().get("content-Length")
if (values != null && !values.isEmpty()) {

// getHeaderFields() returns a Map with key=(String) header 
// name, value = List of String values for that header field. 
// just use the first value here.
String sLength = (String) values.get(0);

if (sLength != null) {
   //parse the length into an integer...
   }
person RAAAAM    schedule 14.03.2011
comment
Надеюсь, когда мы используем AsyncTask, не возникает необходимости в Thread. - person Niki; 15.03.2011