Android - BarProgressa Indeterminada

Pessoal, estou tentando fazer uma classe utilitária para mostrar uma barra de progresso indeterminada quando carrega uma activity.

Isso não acontece à tela fica branca e não mostra a barra, e quando apresenta a tela o rotina já foi executada, o que estou fazendo de errado.

Segue a classe utilitária:

[code]public class Cursor extends Thread{

private static ProgressDialog mprogressDialog;

public static Thread iniciar(final Context ctx, final String titulo, final String mensagem)	{
	mprogressDialog = ProgressDialog.show(ctx, titulo, mensagem);
	mprogressDialog.show();
	new Thread() {
		public void run() {
			try{
				handler.sendEmptyMessage(0);
			} catch (Exception e) {
				MsgAFV.msgDlgErro("Erro BarProgress Infinito.", ctx);
			}
		}
	}.start();
	return null;
}

public static void parar(){
	Cursor.handler.sendEmptyMessage(1);
}

public void atualizaMsg(String msg){
	mprogressDialog.setMessage(msg);
}

private static Handler handler = new Handler(){
	public void handleMessage(Message msg) {
		if(msg.what != 0){
			mprogressDialog.dismiss();
		}
	}
};

}[/code]

Segue o código quando executo dentro do onCreate e a chamada aos metodos da classe utilitaria.

if (Util.listArquivos(".zip").length > 0){ Cursor.iniciar(MainActivity.this, null, "Descompactando Arquivos..."); Util.extrairArquivosZip(); Cursor.parar(); }

Obrigado.

Galera, boa tarde,

Já vi que estou fazendo bobeira dentro do onCreate, mais mesmo assim não estou conseguindo resolver meu problema, como que chamaria os métodos iniciar e parar da minha classe utilitária em uma activity que vai processar desde uma limpeza em tabelas no banco até uma importação de arquivos?

Obrigado.

Conseguiu resolver o seu problema? Eu também estou com esse mesmo problema.
http://www.guj.com.br/java/309489-progressdialog-so-aparece-depois-da-hora

Não, continuo com o mesmo problema.

Não sei mais o que fazer.

Tentei de tudo.

Se tiver novidades me avise, eu tb vou te avisar.

abs

Eu coloquei dentro de um AsyncTask e funcionou na aplicação de testes, porém fiz o mesmo na AsyncTask da minha aplicação real e continuou não funcionando.

Nesse código abaixo funcionou.

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

protected ProgressDialog pdia;
protected Context context;

public DoNothingTask(Context c) {
	this.context = c;
	
	pdia = new ProgressDialog(context);
	pdia.setMessage("bla bla bla");
	pdia.setTitle("titulo");
	pdia.setIndeterminate(true);
	pdia.setProgressStyle(ProgressDialog.STYLE_SPINNER);
}

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

	try {			
		System.out.println("before sleep");
		Thread.sleep(5000);
		System.out.println("after sleep");
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	
	return null;
}

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

	System.out.println("iniciando");
	pdia.show();
}

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

	System.out.println("finalizando");
	pdia.cancel();
}

public Context getContext() {
	return context;
}

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

}
[/code]

Entendi e ate fiz assim, mais acabei voltando atras.

O que eu queria era criar uma classe utilitária, assim mostraria a barra de progresso quando fosse necessário e com o Async eu preciso incluir as rotinas de cada tela dentro do método doInBackground, ou seja, teria que criar vários Async o que não convêm.

Posso estar falando bobeira, mais foi o que entendi ate agora.

Estou aprendendo.

Abs

O seu problema é que não há sincronia em relação com a execução dos metodos


            Cursor.iniciar(MainActivity.this, null, "Descompactando Arquivos...");  
            Util.extrairArquivosZip();//Esse metodo é iniciado
            Cursor.parar(); //porem esse metodo também é chamado sem que o método acima tenha terminado a execução

Ou seja para que ocorra a execução do dialog corretamente voce deve chamar o metodo abaixo:

dentro da Thread na sua classe utilitária mais ou menos assim


 private static ProgressDialog mprogressDialog;  
  
    public static Thread iniciar(final Context ctx, final String titulo, final String mensagem) {  
        mprogressDialog = ProgressDialog.show(ctx, titulo, mensagem);  
        mprogressDialog.show();  
        new Thread() {  
            public void run() {  
                try{ 
                    Util.extrairArquivosZip(); //metodo que era chamado na sua activity
                    handler.sendEmptyMessage(0);  
                } catch (Exception e) {  
                    MsgAFV.msgDlgErro("Erro BarProgress Infinito.", ctx);  
                }  
            }  
        }.start();  
        return null;  
    } 

O que voce está tentando fazer com todo esse codigo pode ser feito tambem com AsyncTask conforme sugestão mais ai vai da sua implementação

Espero ter ajudado

Flw

lucas93lange, entendi o que quis me dizer…

mais eu queria achar uma solução onde apresento a barra de progresso infinita partindo de uma chamada do metodo nessa classe utilitaria.

Vê se estou errado, da forma que você responder eu teria que criar varias classe utilitarias para chamar outros metodos do programa para apresentar o barra de progresso?

No caso o que eu expliquei se aplica a forma como ele implementou, porem uma outra forma de implementar funções em thread secundaria e com a barra de progresso, sem muita complicação seria utilizando AsyncTask.

Segue um link de um video que ensina a implementar a AsyncTask:

Caso você tenha alguma duvida apos ver o video é só perguntar aqui novamente

Desculpa acho que eu entendi o que vc quer é bem simples


 private static ProgressDialog mprogressDialog;  
  
    public static Thread iniciar(final Context ctx, final String titulo, final String mensagem) {  
       dialogo(ctx,titulo,mensagem);
        new Thread() {  
            public void run() {  
                try{ 
                    Util.extrairArquivosZip(); //metodo que era chamado na sua activity
                    handler.sendEmptyMessage(0);  
                } catch (Exception e) {  
                    MsgAFV.msgDlgErro("Erro BarProgress Infinito.", ctx);  
                }  
            }  
        }.start();  
        return null;  
    } 
    
   public static void dialogo(Context ctx,String titulo,String Mensagem){
       mprogressDialog = ProgressDialog.show(ctx, titulo, mensagem);  
       mprogressDialog.show();  
  }

seria algo parecido com isso e assim vc poderia chamar o dialogo dentro de varios metodos dentro desta classe,
mas como eu disse anteriormente há varias soluções para essa questão

lucas93lange, não é somente dentro desta classe, quero chamar o dialog dentro de qualquer classe do projeto quando as rotinas forem pesadas.

O que eu não gostaria é em cada classe (Activity) ter que criar o dialog.

Por exemplo: Gostaria de criar uma classe onde crio o dialog (Classe útil) e ao chamar rotinas pesada iniciar o dialog e após o termindo da rotina fechar o dialog.

Entendi.
Você pode criar uma classe como qualquer outra onde tenha um método para chamar o dialogo e outro para destruir o dialogo.
Um pequeno exemplo abaixo:

public class Dialogo {
	
	private static ProgressDialog dialogo;
	
	/**
	 * Metodo para mostrar o ProgressDialog
	 * @param context - somente o contexto de Activity's,Fragments e etc.
	 * Nunca o getApplicationContext
	 * @param titulo
	 * @param mensagem
	 * 
	 */
	public static void display(Context context,String titulo,String mensagem){
		
		dialogo = new ProgressDialog(context);
		dialogo.setTitle(titulo);//define o titulo do dialogo
		dialogo.setMessage(mensagem);//define a mensagem a ser exibida
		dialogo.setIndeterminate(true);//define se o dialogo será indeterminado
		dialogo.setCancelable(false);//define se o dialogo ira se cancelar ao toque
		//e as demais configuações que forem necessarias voce 
		//adiciona abaixo antes do metodo show();
		dialogo.show();
		
	}
	
/**
 * Metodo para desativar o ProgressDialog
 */
	
	public static void desativar(){
		//Verifica se é nulo para evitar erros no caso de uma chamada errada
		if(dialogo!=null){
			dialogo.dismiss();//metodo da classe para desfazer o dialog
		}
		
	}

}

Como os métodos são estáticos não precisa nem instanciar a classe é só ao realizar a chamada diretamente assim:

  Dialogo.display(SuaActivity.this, "Seu Titulo","Sua Mensagem");//para mostrar o dialogo

  Dialogo.desativar();//para desativar apos o uso

Existem outras possibilidades como por exemplo dialogFragment e etc. , mas esse é apenas um simples exemplo.
Acho q é isso que vc queria, certo?

Sim, é isso que eu queria.

Usei este mesmo exemplo seu e no click de uma botão não mostra o dialog, só apos o processamento da rotina “gravarItemPesquisdo();”.

Olha abaixo o codigo.

public void onClick(View v) { switch (v.getId()) { case R.id.ap_ibtn_gravar: Cursor3.display(this, "titulo", "Mensagem"); gravarItemPesquisado(); Cursor3.desativar(); break; } }

O que deve ser feito para que no click do botão apresente o o dialog?

chama o dialogo dentro do metodo do processamento.

O de desativar o dialogo que vc chama no fim do metodo de processamento

Ja fim isso e tambem não funcionou.

Dentro do metodo “gravarItemPesquisdo();” iniciei e desativei, mais sem sucesso.

Ta dificil!