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?


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();

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.


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.


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.


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

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.