Sou muito novo em programação e tenho algumas dúvidas.
Eu tenho um AsyncTask
que é como eu chamo RunInBackGround
.
e eu começo esse processo como:
new RunInBackGround().execute();
Mas desejo esperar até que esta chamada termine sua execução, antes de prosseguir com as outras instruções de código.
Como eu posso fazer isso?
Existe alguma maneira de fazer isso?
Respostas:
Você precisará chamar o método AsyncTask.get () para obter o resultado de volta e esperar até que a
doInBackground
execução não seja concluída. mas isso irá congelar o thread de IU principal se você não chamar o método get dentro de um Thread .Para obter o resultado de volta no UI Thread, comece
AsyncTask
como:String str_result= new RunInBackGround().execute().get();
fonte
AsyncTask
semget
método e noonPostExecute
método AsyncTask é chamado, o qual fornece resultados u no Thread de IU principalawait
emc#
, e não bloqueie o thread principal, é claroEmbora seja ótimo se seu código puder ser executado em paralelo, pode ser o caso de você simplesmente usar um thread para não bloquear o thread de IU, mesmo se o fluxo de uso do seu aplicativo tiver que esperar por ele.
Você tem quase 2 opções aqui;
Você pode executar o código que deseja aguardar, na própria AsyncTask. Se tiver a ver com a atualização da IU (thread), você pode usar o método onPostExecute. Isso é chamado automaticamente quando o trabalho em segundo plano é concluído.
Se você, por algum motivo, for forçado a fazê-lo na Activity / Fragment / Whatever, também pode se tornar um ouvinte personalizado, que você transmite de sua AsyncTask. Usando isso, você pode ter um método de retorno de chamada em sua Activity / Fragment / Whatever, que só é chamado quando você quiser: também conhecido como quando sua AsyncTask termina com tudo o que você teve que esperar.
fonte
Em seu
AsyncTask
adicione um ProgressDialog como:private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);
você pode setMessage no
onPreExecute()
método como:this.dialog.setMessage("Processing..."); this.dialog.show();
e em seu
onPostExecute(Void result)
método rejeite seuProgressDialog
.fonte
AsyncTask tem quatro métodos.
onPreExecute -- for doing something before calling background task in Async doInBackground -- operation/Task to do in Background onProgressUpdate -- it is for progress Update onPostExecute -- this method calls after asyncTask return from doInBackground.
você pode ligar para o seu trabalho
onPostExecute()
depois de retornar dedoInBackground()
onPostExecute é o que você precisa implementar.
fonte
Acho que a maneira mais fácil é criar uma interface para obter os dados do onpostexecute e executar o Ui da interface:
Crie uma interface:
public interface AsyncResponse { void processFinish(String output); }
Em seguida, em asynctask
@Override protected void onPostExecute(String data) { delegate.processFinish(data); }
Então, em sua atividade principal
@Override public void processFinish(String data) { // do things }
fonte