2010-07-24 2 views
9

J'utilise un AsynTask publique pour télécharger des données, et j'essaie d'afficher une barre de progression qui montrerait la progression du téléchargement. Je pense que j'ai le bon code, mais tout ce que je reçois est un programme de progression. Est-ce que je manque quelque chose? Pourquoi la barre de progression n'apparaît-elle pas? Voici le code. Merci pour les pointeurs.Je veux une barre de progression, mais obtenir 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(); 
    } 
} 

Répondre

9

Probablement vous oubliez de mettre dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

ce code d'exemple qui me fonctionne:

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

Merci - cela fonctionne. La seule chose que j'ai dû changer est d'utiliser le constructeur de paramètre unique et de définir le style de progression. –

+1

Merci, m'a aidé aussi. Mon erreur était que j'appelais 'ProgressDialog.show (...);' et après avoir réglé tous les autres paramètres – Glogo

-1

faire entrée de barre de progression dans votre projet Android fichier XML intention actuelle comme une barre de progression

vérifier également après avoir enregistré dans le fichier R.java pour id de votre barre de progression

l'intention doit être appelé à chaque fois que le téléchargement est lancé

comme

Starta la ctivité (nouvelle intention (this, Progress.class));

4

Il semble que vous utilisez les deux constructeur arg pour ProgressDialog, dont la documentation indique est pour le contexte (premier arg) et le thème id (le second arg).

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

Ainsi, alors que vous pensez que vous réglez l'ProgressStyle à STYLE_HORIZONTAL, vous ne faites pas du tout, vous définissez l'ID du thème à quelque chose qui est sans doute pas un identifiant de thème valide.

Je suggérerais d'utiliser le constructeur d'un seul arg qui prend un contexte, puis de faire comme Pentium10 suggère et appelle _progressDia.setProgressStyle (ProgressStyle.STYLE_HORIZONTAL);

+0

Vous avez raison - je pensais que je mettais le style horizontal en utilisant le constructeur de deux paramètres, mais c'est pas le cas. Je ne sais pas ce que c'est ... de toute façon, les choses fonctionnent maintenant. Merci. –

2

vous pouvez également donner cette balise dans le fichier xml

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

+1

un million d'ups pour cela. l'éditeur gui l'étiquette comme horizontal quand vous le créez mais ne le crée pas comme une barre de progression horizontale (c'est un bug dans eclipse adk) –