Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro AsyncTask

Após implementar a classe EnviaAlunosTask, quando aciono o botão Enviar notas, recebo a seguinte Exception:

FATAL EXCEPTION: AsyncTask #1
Process: br.com.alura.agenda, PID: 11787
java.lang.RuntimeException: An error occurred while executing doInBackground()

Seguido da possível causa:

Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Segue minha classe EnviaAlunosTask:

public class EnviaAlunosTask extends AsyncTask<Void, Void, String>{

    private Context context;
    private ProgressDialog dialog;

    public EnviaAlunosTask(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(context, "Aguarde", "Enviando alunos...", true, true);
    }

    @Override
    protected String doInBackground(Void... params) {
        AlunoDAO dao = new AlunoDAO(context);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        AlunoConverter conversor = new AlunoConverter();
        String json = conversor.converteParaJson(alunos);

        WebClient client = new WebClient();
        String resposta = client.post(json);

        return resposta;
    }

    @Override
    protected void onPostExecute(String resp) {
        dialog.dismiss();

        Toast.makeText(context, resp, Toast.LENGTH_LONG).show();
    }
}

Várias fontes de pesquisas mostram que nesse caso deve implementar o Activity.runOnUiThread().

Mas levando em consideração o vídeo, não seria preciso. Alguém pode me ajudar?

1 resposta
solução!

Problema resolvido.

Tinha feito igual ao vídeo, mas mesmo assim estava com problemas.

Após debugar manualmente, vi que o problema estava em instanciar a classe AlunoDAO dentro do método doInBackground.

A solução foi criar um atributo dao, e instanciar ele dentro do método onPreExecute.

Vou deixar o código da classe EnviaAlunosTask abaixo, caso venha a ser dúvida de mais alguém.

public class EnviaAlunosTask extends AsyncTask<Void, Void, String>{

    private Context context;
    private ProgressDialog dialog;
    AlunoDAO dao;

    public EnviaAlunosTask(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(context, "Aguarde", "Enviando alunos...", true, true);
        dao = new AlunoDAO(context);
    }

    @Override
    protected String doInBackground(Void... params) {
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        AlunoConverter conversor = new AlunoConverter();
        String json = conversor.converteParaJSON(alunos);

        WebClient client = new WebClient();
        String resposta = client.post(json);
        return resposta;
    }

    @Override
    protected void onPostExecute(String resp) {
        dialog.dismiss();

        Toast.makeText(context, resp, Toast.LENGTH_LONG).show();
    }
}