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?
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.
publicclassDoNothingTaskextendsAsyncTask<Void,Void,Void>{protectedProgressDialogpdia;protectedContextcontext;publicDoNothingTask(Contextc){this.context=c;pdia=newProgressDialog(context);pdia.setMessage("bla bla bla");pdia.setTitle("titulo");pdia.setIndeterminate(true);pdia.setProgressStyle(ProgressDialog.STYLE_SPINNER);}@OverrideprotectedVoiddoInBackground(Void...params){try{System.out.println("before sleep");Thread.sleep(5000);System.out.println("after sleep");}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}returnnull;}@OverrideprotectedvoidonPreExecute(){// TODO Auto-generated method stubsuper.onPreExecute();System.out.println("iniciando");pdia.show();}@OverrideprotectedvoidonPostExecute(Voidresult){// TODO Auto-generated method stubsuper.onPostExecute(result);System.out.println("finalizando");pdia.cancel();}publicContextgetContext(){returncontext;}publicvoidsetContext(Contextcontext){this.context=context;}}
L
leandrooooo
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
L
lucas93lange
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
privatestaticProgressDialogmprogressDialog;publicstaticThreadiniciar(finalContextctx,finalStringtitulo,finalStringmensagem){mprogressDialog=ProgressDialog.show(ctx,titulo,mensagem);mprogressDialog.show();newThread(){publicvoidrun(){try{Util.extrairArquivosZip();//metodo que era chamado na sua activityhandler.sendEmptyMessage(0);}catch(Exceptione){MsgAFV.msgDlgErro("Erro BarProgress Infinito.",ctx);}}}.start();returnnull;}
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
L
leandrooooo
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?
L
lucas93lange
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
L
lucas93lange
Desculpa acho que eu entendi o que vc quer é bem simples
privatestaticProgressDialogmprogressDialog;publicstaticThreadiniciar(finalContextctx,finalStringtitulo,finalStringmensagem){dialogo(ctx,titulo,mensagem);newThread(){publicvoidrun(){try{Util.extrairArquivosZip();//metodo que era chamado na sua activityhandler.sendEmptyMessage(0);}catch(Exceptione){MsgAFV.msgDlgErro("Erro BarProgress Infinito.",ctx);}}}.start();returnnull;}publicstaticvoiddialogo(Contextctx,Stringtitulo,StringMensagem){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
L
leandrooooo
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.
L
lucas93lange
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:
publicclassDialogo{privatestaticProgressDialogdialogo;/** * Metodo para mostrar o ProgressDialog * @param context - somente o contexto de Activity's,Fragments e etc. * Nunca o getApplicationContext * @param titulo * @param mensagem * */publicstaticvoiddisplay(Contextcontext,Stringtitulo,Stringmensagem){dialogo=newProgressDialog(context);dialogo.setTitle(titulo);//define o titulo do dialogodialogo.setMessage(mensagem);//define a mensagem a ser exibidadialogo.setIndeterminate(true);//define se o dialogo será indeterminadodialogo.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 */publicstaticvoiddesativar(){//Verifica se é nulo para evitar erros no caso de uma chamada erradaif(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: