2010-07-24 14 views
9

Estoy usando una AsynTask pública para descargar datos, y estoy tratando de mostrar una barra de progreso que muestre el progreso de la descarga. Creo que tengo el código correcto, pero todo lo que obtengo es un diagrama de progreso de spinner. ¿Me estoy perdiendo de algo? ¿Por qué no aparece la barra de progreso? Aquí está el código. Gracias por cualquier punteros.Quiero una barra de progreso pero obtengo un spinner progressdialog

public class FileDownloader extends AsyncTask<String, Integer, Void> 
{ 
private Context _appContext; 
private HttpURLConnection _urlConn; 
private ProgressDialog _progressDia = null; 
private DialogInterface.OnCancelListener _progDiaCancelListener = new DialogInterface.OnCancelListener() 
{ 
    /** 
    * When the progress dialog is canceled, stop the GET request. 
    */ 
    public void onCancel(DialogInterface dialog) 
    { 
     FileDownloader.this.cancel(true); 
    } 
}; 

/** 
* Constructor. 
* @param appContext 
*/ 
public FileDownloader(Context appContext) 
{ 
    _appContext = appContext; 
    _progressDia = new ProgressDialog(_appContext, ProgressDialog.STYLE_HORIZONTAL); 
    _progressDia.setMax(100); 
    _progressDia.setTitle(_appContext.getString(R.string.diaHeader1)); 
    _progressDia.setMessage(_appContext.getString(R.string.diaBody1)); 
    _progressDia.setCancelable(true); 
    _progressDia.setIndeterminate(false); 
    _progressDia.setOnCancelListener(_progDiaCancelListener); 
} 

// Runs on the UI thread 
@Override 
protected void onPreExecute() 
{ 
     _progressDia.setProgress(0); 
     _progressDia.show();       
} 

@Override 
protected Void doInBackground(String... args) 
{ 
    String dloadURL = args[0], 
      saveLoc = args[1]; 
      ... 
      ... 
     while((len = input.read(buf)) > 0) 
     { 
      output.write(buf, 0, len); 
      total += len; 
      publishProgress((int)total * 100/lenghtOfFile); 
     } 
      ... 
      ... 
    } 
    catch(SocketTimeoutException ex) 
    { 
    } 
    finally 
    { 
     ... 
} 

// This is executed on main UI thread. 
@Override 
protected void onProgressUpdate(Integer... values) 
{ 
    _progressDia.setProgress(values[0]); 
} 

@Override 
protected void onCancelled() 
{ 
     ... 
} 

// This is executed on main UI thread. 
@Override 
protected void onPostExecute(Void result) 
{ 
     removeProgressDialog(); 
     ... 
} 

    /** 
    * Remove the message dialog, if still showing. 
    */ 
    private void removeProgressDialog() 
    { 
     if(_progressDia != null && _progressDia.isShowing()) 
     _progressDia.dismiss(); 
    } 
} 

Respuesta

9

Probablemente se olvida de establecer dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

ver este código de ejemplo que me funciona:

ProgressDialog dialog; 

@Override 
protected void onPreExecute() { 
    dialog = new ProgressDialog(this); 
    dialog.setMessage("Matching progress"); 
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    dialog.setMax(100); 
    dialog.setCancelable(false); 
    dialog.show(); 
} 

/* 
* (non-Javadoc) 
* @see android.os.AsyncTask#doInBackground(Params[]) 
*/ 
@Override 
protected Void doInBackground(Void... params) { 

    return null; 

} 

protected void onPostExecute(Void result) { 
    dialog.hide(); 
    dialog = null; 
} 
+0

Gracias - esto funciona. Lo único que tuve que cambiar fue usar el constructor de parámetro único y establecer el estilo de progreso. –

+1

Gracias, me ayudaron a mí también. Mi error fue que estaba llamando 'ProgressDialog.show (...);' y después de eso estableciendo todos los demás parámetros – Glogo

-1

hacer la entrada de la barra de progreso en el archivo XML intención actual proyecto androide como una barra de progreso

también comprobar que después de guardar en el archivo R.java para la Identificación de la barra de progreso

la intención debe ser llamado cada vez que descarga se inicia

como

starta ctivity (nuevo Intent (this, Progress.class));

4

Parece que está usando el constructor de dos arg para ProgressDialog, lo que sugiere la documentación es para el Contexto (primer arg) y el id del tema (el segundo arg).

http://developer.android.com/reference/android/app/ProgressDialog.html#ProgressDialog(android.content.Context, int)

Así, mientras que usted piensa que está ajustando la ProgressStyle a STYLE_HORIZONTAL, que no están haciendo eso en absoluto, que está configurando el identificador de tema a algo que es probable que no es un tema de Identificación válida.

Sugeriría usar el constructor arg que toma un Contexto, y luego hacer lo que Pentium10 sugiere y llamar a _progressDia.setProgressStyle (ProgressStyle.STYLE_HORIZONTAL);

+0

Tienes razón, pensé que estoy configurando el estilo en horizontal usando el constructor de dos param, pero eso es no es el caso. No estoy seguro de qué es eso ... de todos modos, las cosas están funcionando ahora. Gracias. –

2

también puede darle esta etiqueta en el archivo XML

style = "@ android: estilo/Widget.ProgressBar.Horizontal"

+1

un millón de ups por esto. el editor gui lo etiqueta como horizontal cuando lo creas pero no lo crea como una barra de progreso horizontal (esto es un error en eclipse adk) –