[RESOLVIDO] Android - Barra de Progresso

2 respostas
L

Galera estou precisando da ajuda de vocês, estou fazendo o download de uma arquivo e gostaria de mostrar uma barra de progresso conforme o download é processado, como faço isso?

Abaixo a minha classe que faz o download.

public class DownloadTask extends AsyncTask<String, Integer, String> {

		private ProgressDialog mProgressDialog;
		private Context context;

		public DownloadTask(Context context) {
			this.context = context;
		}

		@Override
		protected void onPreExecute() {
			mProgressDialog = new ProgressDialog(context);
			mProgressDialog.setMessage("Download:");
			mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mProgressDialog.setCancelable(true);
			mProgressDialog.show();
		}

		@Override
		protected String doInBackground(String... sUrl) {

			InputStream input = null;
			OutputStream output = null;
			HttpURLConnection connection = null;

			try {
				URL url = new URL(sUrl[0]);
				connection = (HttpURLConnection) url.openConnection();
				connection.connect();

				// Esperado o cod. de resposta igual a 200 ou seja conexão OK
				if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
					return "Server returned HTTP "+connection.getResponseCode()+" "+connection.getResponseMessage();
				}

				// Comprimento do conteudo em bytes
				int fileLength = connection.getContentLength();

				// download the file
				input = connection.getInputStream();
				output = new FileOutputStream("//mnt/sdcard/Recebe/download.txt");

				byte data[] = new byte[4096];
				long total = 0;
				int count;
				
				mProgressDialog.setMax(17136);
				
				int contador = 0;
				while ((count = input.read(data)) != -1) {
					// allow canceling with back button
					if (isCancelled()) {
						input.close();
						return null;
					}
					total += count;
					Log.e("TAM.WHILE", String.valueOf(contador++).toString());

					if (fileLength > 0){// only if total length is known
						//publishProgress((int) (total * 100 / fileLength));	
						//publishProgress(contador++);	
						mProgressDialog.setProgress(mProgressDialog.getProgress() + contador++);
					}
					output.write(data, 0, count);
				}
			} catch (Exception e) {
				Log.e("ERROR", e.getMessage().toString());
				return e.toString();
			} finally {
				try {
					if (output != null)
						output.close();
					if (input != null)
						input.close();
				} catch (IOException ignored) {}
				if (connection != null)
					connection.disconnect();
			}
			return null;
		}

		@Override
		protected void onProgressUpdate(Integer... params) {
			//mProgressDialog.setProgress(mProgressDialog.getProgress() + params[0]);
		}

		@Override
		protected void onPostExecute(String params) {
			mProgressDialog.dismiss();
		}

	}

Obrigado

2 Respostas

L

Galera, consegui inserir a barra de progresso, o problema agora é que a barra de progresso é preenchida mais o download não terminou, pois não passou pelo metodo onPostExecute para fechar a barra, o que estou fazendo de errado. Abaixo o código.

public class DownloadTask extends AsyncTask<String, Integer, String> {

		private ProgressDialog mProgressDialog;
		private Context context;

		public DownloadTask(Context context) {
			this.context = context;
		}

		@Override
		protected void onPreExecute() {
			mProgressDialog = new ProgressDialog(context);
			mProgressDialog.setMessage("Download:");
			mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mProgressDialog.setCancelable(true);
			mProgressDialog.show();
		}

		@Override
		protected String doInBackground(String... sUrl) {

			InputStream input = null;
			OutputStream output = null;
			HttpURLConnection connection = null;

			try {
				URL url = new URL(sUrl[0]);
				connection = (HttpURLConnection) url.openConnection();
				connection.connect();

				// Esperado o cod. de resposta igual a 200 ou seja conexão OK
				if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
					return "Server returned HTTP "+connection.getResponseCode()+" "+connection.getResponseMessage();
				}

				// Comprimento do conteudo em bytes
				int totalSize = connection.getContentLength();

				// download the file
				input = connection.getInputStream();
				output = new FileOutputStream("//mnt/sdcard/JN/Recebe/download.txt");

				byte buffer[] = new byte[1];
				long downloadedSize = 0;
				int bufferLength; 
				while ((bufferLength = input.read(buffer)) != -1) {
					if (isCancelled()) {
						input.close();
						return null;
					}
					downloadedSize += bufferLength;

					output.write(buffer, 0, bufferLength);
					publishProgress((int)downloadedSize, totalSize);
				}
			} catch (Exception e) {
				Log.e("ERROR", e.getMessage().toString());
				return e.toString();
			} finally {
				try {
					if (output != null)
						output.close();
					if (input != null)
						input.close();
				} catch (IOException ignored) {}
				if (connection != null)
					connection.disconnect();
			}
			return null;
		}

		@Override
		protected void onProgressUpdate(Integer... params) {
			mProgressDialog.setProgress(mProgressDialog.getProgress() + params[0]);
			mProgressDialog.setMax(params[1]);
		}

		@Override
		protected void onPostExecute(String params) {
			mProgressDialog.dismiss();
		}
	}
L

Resolvido era uma falta de atenção minha.

Criado 16 de maio de 2014
Ultima resposta 19 de mai. de 2014
Respostas 2
Participantes 1