1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

AsyncTask - Como aguardar que várias asynctasks sejam concluídas para prosseguir?

Tenho um App em que durante o splash, verifico se os dados de login estão corretos (via webservice) e caso sim, carrego os dados também via webservice e só depois quero que passe para a próxima tela.

Para carregar dados do webservice fiz um método genérico em que se passa a URL do recurso e a classe da qual os dados recebidos serão convertidos.

public class ConsultaDados extends AsyncTask<ArrayList<Object>, Void, ArrayList<Object>> {    
    @Override
    protected ArrayList<Object> doInBackground(ArrayList<Object>... params) {
        try {            
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpParams httpParams = httpClient.getParams();
            HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
            HttpConnectionParams.setSoTimeout(httpParams, 20000);
            httpClient.setParams(httpParams);

            String urlComplemento = params[0].get(0).toString();
            HttpGet httpGet = new HttpGet(Sessao.URL_WEBSERVICE + urlComplemento);

            HttpResponse response = httpClient.execute(httpGet);

            String result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
            try {
                Gson gson = new Gson();
                ArrayList<Object> listaRetorno = new ArrayList<Object>();

                JsonParser parser = new JsonParser();
                JsonArray array = parser.parse(result).getAsJsonArray();

                for (int i = 0; i < array.size(); i++) {
                    listaRetorno.add(gson.fromJson(array.get(i), (Class) params[0].get(1) ));
                }

                return listaRetorno;

            } catch (Exception ex) {
                ex.printStackTrace();
                return new ArrayList<Object>();
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            return new ArrayList<Object>();
        }
    }

}

No Splash então, após validado o login, chamo um método de outra classe que por sua vez chama os controladores de cada classe para carregar dados de cada tabela. Esses controladores chamam a classe genérica acima. Ou seja, são várias chamadas a essa AsyncTask e eu queria que só prosseguisse após todas elas estejam concluídas. Por ser feito genericamente acredito que não tenha como eu usar o método onPostExecute. O que fazer então?

Segue código do splash:

try {
                        ControladorUsuario controladorUsuario = new ControladorUsuario();
                        Usuario usuarioSalvo = controladorUsuario.getUsuarioSalvo(Splash.this);
                        if ((usuarioSalvo != null) && (controladorUsuario.validaLogin(Splash.this, usuarioSalvo.getLogin(), usuarioSalvo.getSenha()))) {
                            DataBaseStructure.removeDadosDoBanco(Splash.this);
                            DataBaseStructure.atualizaDadosDoBanco(Splash.this);
                            startActivity(new Intent(Splash.this, MapaCheckin.class));
                        } else {
                            startActivity(new Intent(Splash.this, Login.class));
                        }
                    } catch (Exception ex) {
                        startActivity(new Intent(Splash.this, Login.class));
                    }

Do método que chama os controladores:

public static void atualizaDadosDoBanco(Context context) {
        try {
            new ControladorEmpresa().insereDados(context);
            new ControladorVendedor().insereDados(context);
            new ControladorPorte().insereDados(context);
            new ControladorRamoDeAtividade().insereDados(context);
            new ControladorCliente().insereDados(context);
            new ControladorMotivoDaVenda().insereDados(context);
            new ControladorConcorrente().insereDados(context);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

E de um controlador que chama a AsyncTask

public void insereDados(Context context) throws Exception {    //throws GeralException, FalhaNaConexaoException,    InsereDadosException, OutOfMemoryErrorException, EnderecoInvalidoException {
        String URL = "empresa/listaEmpresas/"+Sessao.usuarioLogado.getEmpresaId();
        ArrayList<Object> parametros = new ArrayList<Object>();
        parametros.add(URL);
        parametros.add(Empresa.class);
        ArrayList<Object> empresas = new ConsultaDados().execute(parametros).get();
        DataBaseStructure.insereDados(context, empresas, DatabaseHelper.getInstacia(context).getWritableDatabase());
    }
  • Antes de instanciar as AsyncTasks você já sabe a quantidade delas?

    A H Gusukuma   26 de jan de 2015
  • Sim, porém conforme o App vai crescendo pode aumentar. No penúltimo trecho de código tem a chamada de cada controlador que por sua vez chama a mesma asynctask passando parâmetros diferente. No momento então eu sei que tem 7. Mas sei que logo terá mais 3 para implementar.

    alanbravin   26 de jan de 2015
  • Esse trecho do código está em outra thread ou AsyncTask?

    A H Gusukuma   26 de jan de 2015
  • Em resumo é assim: Splash chama Outra Classe que chama todos os controladores. Cada controlador chama a mesma AsyncTask com parâmetros diferentes. É melhor dar uma olhada nos meus códigos acima para ver certinho a rotina.

    alanbravin   26 de jan de 2015
  • Você colocou partes do código, não dá para saber o que perguntei.

    A H Gusukuma   26 de jan de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags android threads ou faça a sua própria pergunta.