Versão atual:

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

Versão(1):

Ver a versão formatada

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

Comentário

new question