[RESOLVIDO] ProgressDialog só aparece depois da hora

Bom dia a todos.

Estou com um problema para renderizar uma ProgressDialog.
Eu implementei da maneira sugerida pela documentação, porém minha janela não aparece na hora que deveria, só renderiza após o término de toda a ação.

Segue abaixo o código que fiz para testar isso.

[code]public class MainActivity extends ActionBarActivity {

private Button btn;

protected ProgressDialog pdia;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	pdia = new ProgressDialog(MainActivity.this);
	pdia.setMax(100);
	pdia.setMessage("Its loading....");
	pdia.setTitle("ProgressDialog bar example");
	pdia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
	
	// pdia = ProgressDialog.show(MainActivity.this, "Autenticando",
	// "Contactando o servidor, por favor, aguarde alguns instantes.",
	// true);

	btn = (Button) findViewById(R.id.btn);

	btn.setOnClickListener(new View.OnClickListener() {

		@Override
		public void onClick(View v) {
			try {
				pdia.show();   // Aqui deveria aparecer a janela, mas nada acontece

				// Bloco de código que substitui a minha lógica
				System.out.println("before sleep");
				pdia.setProgress(40);
				Thread.sleep(5000);
				pdia.setProgress(80);
				System.out.println("after sleep");
				
				System.out.println("finalizando");
				pdia.setProgress(100);

                       // comentei o fechamento dela, pois senão ela nem aparece

// pdia.dismiss();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});

     // Somente aqui no fim do método que a janela aparece, já com 100%
}

}[/code]

Alguém sabe me dizer o que estou fazendo errado? Acredito que o erro seja meu, pois quase todos os aplicativos que envolvem download têm uma janela dessas funcionando.

Desde já agradeço.

Após escrever esse post vi que já haviam perguntado algo similar em http://www.guj.com.br/java/309172-android—barprogressa-indeterminada-. Porém, como é um pouco diferente e lá também está sem resposta, vou manter este tópico aqui também.



		pdia = new ProgressDialog(MainActivity.this);
		pdia.setMax(100);
		pdia.setMessage("Its loading....");
		pdia.setTitle("ProgressDialog bar example");
		pdia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		btn = (Button) findViewById(R.id.btn);

		btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				pdia.show();//mostrar dialog antes do try
				Log.d("teste",Calendar.getInstance().getTime().toString());
				//so imprime a data para controle no log
				try{
					Thread.sleep(5000);
					Log.d("Teste","Dormir 5 seg.");
					Log.d("teste",Calendar.getInstance().getTime().toString());
				}catch(InterruptedException e){
					e.printStackTrace();
				}//logica parecida com a sua 
				new Thread() {
					int count = 0;
					public void run() {						
						try {
							while (count <= 100) {
								pdia.setProgress(count);
								Log.d("Teste", count + "");
								count++;
								Thread.sleep(1000);
							}
							pdia.dismiss();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}.start();//um exemplo funcional adapte a sua necessidade
			}
			
		});

Eu apenas peguei o seu codigo e adaptei para um exemplo funcional, porem voce pode adaptar para o seu uso
repara que eu simulei o progresso do progressbar num loop que incrementa a % e da um thread.sleep em toda a interação para passar a sensação de que está sendo realizada uma tarefa numa thread secundaria e nesse caso não precisou implmentar um handler ou utilizar o metodo runOnUIThread()

O que acontecia no seu codigo era que ele chamava o Thread.Sleep() da Thread principal é não de uma secundaria.O que dependendo do tempo passado no parametro pode ocassionar a mensagem de travamento do Android porem sempre o usuario vai perceber o travamento da atividade

Espero ter ajudado
Flw

Obrigado pela ajuda.

Cara eu não consegui fazer rodar.

Nem seguindo o exemplo do nosso colega lucas93lange.

Na linha abaixo do codigo não mostra a barra de progresso.

leandrooooo,

Por favor responder com o codigo que vc está utilizando.
PS: não precisa ser o codigo todo somente o da classe onde vc quer implementar a função

Leandro,

A solução que eu utilizei consiste em carregar a tela de dialog no onPreExecute e assim que acabar, chamar um callback no onPostExecute. Se você chamar a task e usar o método get no código onde ela é chamada, não vai funcionar mesmo.

Comigo só funcionou usando essa lógica de deixar a task executando sozinha e quando ela estiver pronta ela chama outra classe que dá continuidade à aplicação.

[code]
public class TelaInserindoRespostaTask extends AsyncTask<Void, Void, Void> {

protected ProgressDialog pdia;
protected TelaQuestao context;

public TelaInserindoRespostaTask(TelaQuestao c) {
	this.context = c;

	StringBuilder mensagem = new StringBuilder("Acertos: ");
	mensagem.append(SessionBo.getQuestoesCertas());
	mensagem.append(" de ");
	mensagem.append(SessionBo.getQuestoesResolvidas());
	
	pdia = new ProgressDialog(context);
	pdia.setMessage(mensagem.toString());
	pdia.setTitle("Baixando próxima questão");
	pdia.setIndeterminate(true);
	pdia.setProgressStyle(ProgressDialog.STYLE_SPINNER);
}

@Override
protected Void doInBackground(Void... params) {

	if (context.isCompletouEnvio()) {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	while(!context.isCompletouEnvio()){}

	return null;
}

@Override
protected void onPreExecute() {
	// TODO Auto-generated method stub
	super.onPreExecute();

	pdia.show();
}

@Override
protected void onPostExecute(Void result) {
	super.onPostExecute(result);
	
	try {
		pdia.dismiss();
	}
	catch(Exception exc) {
		exc.printStackTrace();
	}
    context.completouTela();

}

public TelaQuestao getContext() {
	return context;
}

public void setContext(TelaQuestao context) {
	this.context = context;
}

}[/code]

Então Srs, ainda não deu certo.

Vou tentar se mais claro com o problema.

Tenho essa classe abaixo:

[code]
public class Cursor{

private static ProgressDialog mprogressDialog;

public static void iniciar(final Context ctx, final String titulo, final String mensagem)	{
	mprogressDialog = new ProgressDialog(ctx);  
	mprogressDialog.setTitle(titulo);  
	mprogressDialog.setMessage(mensagem);  
	mprogressDialog.setIndeterminate(true);  
	mprogressDialog.setCancelable(false);
	mprogressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
	mprogressDialog.show();
}

public static void parar(){
	if (mprogressDialog != null){
			if (mprogressDialog .isShowing()){
				mprogressDialog .dismiss();		
			}
		}
}

public static void atualizaMsg(String msg){
       if (mprogressDialog != null){
	if (mprogressDialog.isShowing()){
		mprogressDialog.setMessage(msg);
	}
       }
}

}[/code]

Onde tenho os metodos: iniciar (Apresenta o dialog), atualizar (Atualiza a msg dialog) e parar (para o dialog).

Esse metods são chamados dentro das minha activity, seja em uma mudança de tela ou em uma rotina da propria activity, exemplo.

Chamando outra tela:
Abaixo o codigo, repare que nele chamo o metodo display.

Cursor.display(ActivityMain.this, "", "Buscando Clientes..."); Intent foraRota = new Intent(ActivityMain.this, ActivityClientes.class); startActivity(foraRota); dialog.dismiss();
E no final do onCreate da activity ActivityClientes eu chamo o metodo para.

Até aqui funciona direitinho, apresenta o dialog e na tela seguinta fecho o dialod.

O problema que tenho e q não consigo fazer funcionar é quando chamo a esses metodos antes de algumas rotinas na tela que está aberta, segue dois exemplos.

[code]Cursor.display(ActivityMain.this, null, “Descompactando Arquivos…”);
descompactandoArquivos();
Cursor.parar();

				Cursor.display(ActivityMain.this,  "", "Calculando Valores...");
				calculandoValores();
				Cursor.parar();
				[/code]

Neste caso não mostra o dialog.

Eu resolveria esse problema criando o aSync para cada rotina, mais a minha ideia é ter essa classe “Cursor” como utilitaria e mostrar o dialog quando for preciso, se ter que estar escrevendo tudo o codigo novamente.

Valew.

E quem puder compartilha uma solução eu agradeço.

Obrigado.

Veja um topico parecido aonde tem a resposta para isso:

http://www.guj.com.br/java/309172-android---barprogressa-indeterminada-

E simplesmente o lugar aonde vc esta chamando os metodos da classe utilitaria.

lucas93lange,

Nem mesmo nesse topico o problema foi resolvido.

Foi eu que criei esse topico.

essas rotinas que você chama são threads secundarias(você instancia uma Thread dentro dos métodos)?
Se sim, é bem provável (para não dizer com certeza) que esse é o problema.

O primeiro parâmetro do método abaixo muda de acordo com a Activity que está sendo apresentada


Cursor.display(ActivityMain.this,  null, "Descompactando Arquivos...");  

Outra coisa é que o primeiro parâmetro do método acima pode ser substituído por:


Cursor.display(getBaseContext(),  null, "Descompactando Arquivos...");  

Somente dentro de Activity’s e de classes que herdem de Context ou de ContextWrapper.

Cara já está esgotando todas as possibilidades do que pode ter dado errado.