Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Nesse ponto do curso... Quando salvo na tela aparece o produto 2x

Olá. Não sei o que faço errado.

public void salva(Produto produto, DadosCarregadosListener<Produto> listener) {
        Call<Produto> call = service.salva(produto);
        call.enqueue(new Callback<Produto>() {
            @Override
            public void onResponse(Call<Produto> call, Response<Produto> response) {
                Produto produtoSalvo = response.body();
                listener.quandoCarregados(produtoSalvo);
                new BaseAsyncTask<>(() -> {
                    long id = dao.salva(produtoSalvo);
                    return dao.buscaProduto(id);
                }, listener::quandoCarregados).execute();
            }

            @Override
            public void onFailure(Call<Produto> call, Throwable t) {

            }
        });
    }

Quando salvo está aparecendo na tela 2 vezes o produto salvo. Não sei porquê.

Tentei retirar o ".execute()" da instrução. Funcionou, aparece o produto só uma vez. Mas observei que o produto fica salvo só na API internamente não.

O professor não tirou o execute e não teve problema de duplicidade

Alguém sabe o que acontece? Ou onde pode estar o erro

2 respostas
solução!

Olá, Fernando! Parece que você está enfrentando um problema comum em programação, mas não se preocupe, vamos tentar resolver isso juntos.

Analisando o seu código, parece que o produto está sendo salvo duas vezes porque você está chamando o método listener.quandoCarregados(produtoSalvo); duas vezes. Uma vez depois de receber a resposta da API e outra vez depois de salvar o produto no banco de dados local.

public void salva(Produto produto, DadosCarregadosListener<Produto> listener) {
    Call<Produto> call = service.salva(produto);
    call.enqueue(new Callback<Produto>() {
        @Override
        public void onResponse(Call<Produto> call, Response<Produto> response) {
            Produto produtoSalvo = response.body();
            listener.quandoCarregados(produtoSalvo); // Primeira vez
            new BaseAsyncTask<>(() -> {
                long id = dao.salva(produtoSalvo);
                return dao.buscaProduto(id);
            }, listener::quandoCarregados).execute(); // Segunda vez
        }

        @Override
        public void onFailure(Call<Produto> call, Throwable t) {

        }
    });
}

O método listener.quandoCarregados(produtoSalvo); é responsável por atualizar a interface do usuário (UI) e mostrar o produto salvo. Quando você o chama duas vezes, o produto é exibido duas vezes.

Para resolver o problema, você pode remover a primeira chamada listener.quandoCarregados(produtoSalvo); e manter apenas a chamada que ocorre após o produto ser salvo no banco de dados local. Assim, o produto será exibido apenas uma vez, após ser salvo tanto na API quanto internamente.

public void salva(Produto produto, DadosCarregadosListener<Produto> listener) {
    Call<Produto> call = service.salva(produto);
    call.enqueue(new Callback<Produto>() {
        @Override
        public void onResponse(Call<Produto> call, Response<Produto> response) {
            Produto produtoSalvo = response.body();
            new BaseAsyncTask<>(() -> {
                long id = dao.salva(produtoSalvo);
                return dao.buscaProduto(id);
            }, listener::quandoCarregados).execute();
        }

        @Override
        public void onFailure(Call<Produto> call, Throwable t) {

        }
    });
}

Testa ai, qualquer coisa manda aqui de novo.

Espero ter ajudado e bons estudos!

Obrigado Renan

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software