Esperando até que a tarefa assíncrona termine seu trabalho

86

Sou muito novo em programação e tenho algumas dúvidas.

Eu tenho um AsyncTaskque é 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?

homem Morcego
fonte
2
O ponto de AsyncTask é que ele é assíncrono, o que significa que não está sincronizado com o resto do código.
Gjordis
3
Você pode usar seu método onPostExecute () de AsyncTask para obter o retorno de chamada em sua classe.
DcodeChef
5
você realmente não quer esperar até que termine. O que você quer é saber quando acaba.
njzk2
3
@DcodeChef é o único que entendeu o que ele queria na pergunta.
Please_Dont_Bully_Me_SO_Lords
1
Acho que esta é a resposta que você está procurando stackoverflow.com/questions/13079645/…
user3362415

Respostas:

131

espere até que esta chamada termine de ser executada

Você precisará chamar o método AsyncTask.get () para obter o resultado de volta e esperar até que a doInBackgroundexecuçã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 AsyncTaskcomo:

String str_result= new RunInBackGround().execute().get();
ρяσѕρєя K
fonte
3
então, como esperar pelo resultado e não bloquear o thread principal da IU? digamos que o código aguarde o resultado, mas, nesse meio tempo, a barra de progresso continua rolando!
Muhammad Naderi de
2
@MuhammadNaderi: Use AsyncTasksem getmétodo e no onPostExecutemétodo AsyncTask é chamado, o qual fornece resultados u no Thread de IU principal
ρяσѕρєя K
3
certeza de que esta é uma solução alternativa, que venho usando há algum tempo, mas às vezes preciso que o código aguarde a tarefa assíncrona, algo como awaitem c#, e não bloqueie o thread principal, é claro
Muhammad Naderi
2
@ ρяσѕρєяK obrigado, obrigado um milhão. você não tem ideia do quanto eu puxei o cabelo por causa desse problema porém com apenas um .get () resolveu (você está brincando) apenas um .get () !!!!!
Code_Worm
Como você pode usar AsyncTask e evitar get () para evitar que a IU congele?
Arjun Issar
37

Embora 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;

  1. 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.

  2. 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.

Stefan de Bruijn
fonte
6
Esta é uma resposta excelente, deveria ser aceita. Também aqui está um exemplo de como fazer isso com AsyncTasks: stackoverflow.com/questions/12575068/…
Jose Gonzalez
em sua segunda opção, enquanto você joga a intenção em seu receptor, o tópico principal será retomado corretamente. OP não precisa disso.
LincyTonita de
16

Em seu AsyncTaskadicione 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 seu ProgressDialog.

KDeogharkar
fonte
15

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.

AndroidGeek
fonte
1

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

}
Nearyuk
fonte