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!