Android: mise à jour de la progressbar pour le fichier de téléchargement

J'ai ben bloqué sur ce pendant un certain temps. J'ai un asynch tâche de téléchargement d'une image sur un serveur web. Fonctionne très bien.

Je suis une barre de progression de dialogue mis en place pour cela. Mon problème est de savoir comment précisément de mettre à jour la barre de progression. Tout ce que j'ai essayer de résultats en va de 0 à 100 en une seule étape. Ce n'est pas grave si ça prend 5 secondes ou 2 minutes. La barre se bloque sur 0 puis atteint 100 après le téléchargement est terminé.

Voici mon doInBackground code. Toute aide est appréciée.

EDIT: j'ai mis à jour le code ci-dessous pour inclure l'ensemble de la AsynchTask

private class UploadImageTask extends AsyncTask<String,Integer,String> {
private Context context;   
private String msg = "";
private boolean running = true;
public UploadImageTask(Activity activity) {
this.context = activity;
dialog = new ProgressDialog(context);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMessage("Uploading photo, please wait.");
dialog.setMax(100);
dialog.setCancelable(true);
}
@Override
protected void onPreExecute() {
dialog.show();
dialog.setOnDismissListener(mOnDismissListener);
}
@Override
protected void onPostExecute(String msg){
try {
//prevents crash in rare case where activity finishes before dialog
if (dialog.isShowing()) {
dialog.dismiss();
}
} catch (Exception e) {
} 
}
@Override
protected void onProgressUpdate(Integer... progress) {        
dialog.setProgress(progress[0]);
}
@Override
protected String doInBackground(String... urls) {
if(running) {
//new file upload
HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
String exsistingFileName = savedImagePath;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024 * 1024;
String urlString = "https://mysite.com/upload.php";
float currentRating = ratingbar.getRating();
File file = new File(savedImagePath);
int sentBytes = 0;
long fileSize = file.length();
try {
//------------------ CLIENT REQUEST
//open a URL connection to the Servlet
URL url = new URL(urlString);
//Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
//Allow Inputs
conn.setDoInput(true);
//Allow Outputs
conn.setDoOutput(true);
//Don't use a cached copy.
conn.setUseCaches(false);
//Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
+ exsistingFileName + "\"" + lineEnd);
dos.writeBytes(lineEnd);
FileInputStream fileInputStream = new FileInputStream(new File(exsistingFileName));
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
//read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
//Update progress dialog
sentBytes += bufferSize;
publishProgress((int)(sentBytes * 100 / fileSize));
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
//send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
dos.flush();
dos.close();
fileInputStream.close();
}catch (MalformedURLException e) {
}catch (IOException e) {
}
//------------------ read the SERVER RESPONSE
try {
inStream = new DataInputStream(conn.getInputStream());
//try to read input stream
//InputStream content = inStream.getContent();
BufferedInputStream bis = new BufferedInputStream(inStream);
ByteArrayBuffer baf = new ByteArrayBuffer(20);
long total  = 0;
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
/* Convert the Bytes read to a String. */
String mytext = new String(baf.toByteArray());
final String newtext = mytext.trim();
inStream.close();
} catch (Exception e) {
}
}
return msg;
}
}
avez-vous mettre en œuvre onProgressUpdate dans la classe AsyncTask ?
Je crois que oui. J'ai mis à jour le code ci-dessus pour inclure la totalité de la tâche.
juste essayer : prendre sentBytes & de la taille du fichier en tant que float ou double
Merci pour la suggestion. J'obtiens le même résultat avec les deux de double & float. Il ressemble à publishProgress(...); il est appelé qu'une seule fois.
alors je vous suggère de mettre journal "(int)(sentBytes * 100 / taille de fichier)" avant publishProgress((int)(sentBytes * 100 / taille)); & aussi mettre le journal dans le début de onProgressUpdate pour "progrès" [0]". Ainsi, vous pouvez connaître la valeur en passant.

OriginalL'auteur user401183 | 2012-08-09