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

Problema com AsyncTask Android

bom dia pessoal!

Meu Problema:

Eu criei uma AsyncTask meio que genérica, para se comunicar com meu WebService e Persistir os dados no meu SQL, independente do endereço do WebService.

estpa funcionando em meu projeto perfeitamente! segue a classe:

package br.com.cooperrubi.webservices;

import org.json.JSONArray;
import org.json.JSONException;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;
import br.com.cooperrubi.DAO.Dao;
import br.com.cooperrubi.postocomboio.R;
import br.com.cooperrubi.postocomboio.regrasDeNegocios.Endereco;
import br.com.cooperrubi.postocomboio.regrasDeNegocios.JsonConvert;

/**
 * @author Ricardo Bras
 * @02/07/2013 IFieldMobile
 * @param <E>
 */

@SuppressLint("NewApi")
public class TaskDownloadJson<E> extends AsyncTask<String, Integer, Long> {

    private ProgressBar progressbar;
    private Dao<E> dao;
    private Class<?> classe;
    private TextView textView;
    boolean pessoa = false;
    private JSONArray JSONArray;

    public TaskDownloadJson(Activity activity, Dao<E> dao, Class<?> clazz) {

        progressbar = (ProgressBar) activity.findViewById(R.id.progressBar);
        this.dao = dao;
        this.classe = clazz;
        textView = (TextView) activity.findViewById(R.id.txt_progressBar);
        textView.setText("Atualizando.... " + clazz.getSimpleName());
    }

    @Override
    protected void onPreExecute() {
        progressbar.setProgress(0);
        textView.setVisibility(TextView.VISIBLE);
        progressbar.setVisibility(ProgressBar.VISIBLE);

    }

    @Override
    protected Long doInBackground(String... params) {
        atualizar(params[0]);
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        progressbar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(Long result) {
        progressbar.setVisibility(ProgressBar.INVISIBLE);
        textView.setText(classe.getSimpleName() + " Atualizado...");
        textView.setVisibility(TextView.INVISIBLE);
    }

    // Metodo para atualizar oo bd SQLITE
    public void atualizar(String url) {
        String json = new DownloadJson().getRESTFileContent(Endereco.getServidorREST() + url);

        if (json != "") {
            dao.deleteAll();

            try {
                JSONArray = new JSONArray(json);

                int tamanhoArray = JSONArray.length();
                // percorrer o array e gravar o objeto ao bd
                for (int i = 0; i < JSONArray.length(); i++) {
                    @SuppressWarnings("unchecked")
                    E object2 = ((E) JsonConvert.toObject(
                            JSONArray.getString(i), classe));
                    E object = object2;
                    dao.insert(object);
                    publishProgress((int) (i / ((float) tamanhoArray) * 100));

                }

            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

    }

}

até aí está uma maravilha. Na minha Activity executo da seguinte forma:

            new TaskDownloadJson<Posto>(this, postoDao, Posto.class).execute(Endereco.nomeJSONPosto);

e funciona normal para atualizar, mas quando eu executo dois ao mesmo tempo exemplo:

            new TaskDownloadJson<Posto>(this, postoDao, Posto.class).execute(Endereco.nomeJSONPosto);

            new TaskDownloadJson<Pessoas>(this, pessoaDao, Pessoas.class).execute(Endereco.nomeJSONPessoa);

trava tudo!!!

eu sei que o processo e concorrente, e funciona como thread em background no android. mas eu quero que execute cada AsyncTask de uma vez e não as duas ao mesmo tempo!

ou seja, espera a primeira terminar para rodar a segunda!

como se faz isso? alguma dica?

vlw obrigado!

  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!

3 respostas

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